import { httpAxios } from "@/api/ApiInstance" import type { AiCoursewareTemplateId } from "@/config/aiCoursewareTemplates" export interface AiCoursewareOutlineQuery { id: string fromType?: string extraPrompt?: string preferences?: AiCoursewarePreferences } export interface AiCoursewareGenerateQuery { extraPrompt?: string imageAspectRatios?: Record id: string fromType?: string outline: AiCoursewareOutline templateId?: AiCoursewareTemplateId visualPrompt?: string preferences?: AiCoursewarePreferences regeneratePageNo?: number repairOnly?: boolean outlineConfirmed?: boolean outlineMode?: 'teaching_plan' } export interface AiCoursewarePreferences { teachingApproach?: 'auto' | 'inquiry' | 'story' | 'practice' resourceMode?: 'teacher_supplement' | 'auto_bind' learningContext?: string lessonScope?: string lessonMinutes: number minPages: number maxPages: number assetStyle: "illustration" | "photo" | "mixed" sourceImagePolicy: "strict" | "balanced" | "creative" requireAudio: boolean requireVideo: boolean enableAnimations: boolean } export interface AiCoursewareOutline { teachingDesign?: { approach: string drivingQuestion: string learningPath: string[] consistencyRules?: string[] } teacherRequirements?: string title: string templateId?: AiCoursewareTemplateId gradeName: string textbookName: string unitName: string chapterName: string courseType: string style: "cartoon" | "clean" | string visualBible?: AiCoursewareVisualBible textbookResearch?: AiCoursewareTextbookResearch pages: AiCoursewarePage[] } export interface AiCoursewareVisualBible { artStyle?: string palette?: string[] environment?: string lighting?: string recurringProps?: string[] characters?: Array<{ name: string appearance?: string costume?: string signatureColor?: string }> } export interface AiCoursewareTextbookResearch { exactMatch: boolean confidence: "HIGH" | "MEDIUM" | "LOW" | string courseType: string contentSummary: string works: string[] verifiedFacts: string[] teachingObjectives: string[] teachingFocus: string[] learningActivities: string[] missingEvidence: string[] sources: Array<{ index?: number title?: string url: string official?: boolean }> } export interface AiCoursewarePage { imageReview?: string imageStatus?: 'not_required' | 'ready' | 'budget_exhausted' | 'generation_failed' | 'review_rejected' | 'reference_missing' | 'unavailable' /** 教师确认的教学安排,指导扩写,不直接作为学生可见正文。 */ teachingBrief?: string pageNo: number type: string title: string subtitle?: string bullets: string[] teachingStage?: string teachingPurpose?: string learningEvidence?: string durationMinutes?: number objectiveIds?: string[] optional?: boolean requiredVisual?: boolean studentContent?: { headline?: string example?: string points?: string[] steps?: string[] comparisonGroups?: Array<{ label: string; points: string[] }> } activity?: { task?: string steps?: string[] } classroomAction?: { teacherInstruction?: string studentTask?: string interactionType?: string modelExample?: string successCriteria?: string storyScript?: string } diagram?: { kind: 'beats' | 'rhythm' | 'duration' | 'pitch' | 'sequence' caption: string basis?: string items: Array<{ label: string; value?: number }> } visual?: { layout?: string style?: string mainVisual?: string imageKeywords?: string[] } visualPlan?: { composition?: 'full_scene' | 'image_left' | 'image_right' | 'image_top' | 'comparison' | 'steps' | 'focus_question' | 'concept_grid' visualMode?: 'generated_image' | 'reference_image' | 'native_diagram' | 'text_only' imageNecessity?: 'essential' | 'supporting' | 'optional' | 'none' imageReason?: string visualShare?: number textPresentation?: 'plain' | 'cards' | 'steps' | 'grid' imagePurpose?: 'scene' | 'observation' | 'comparison' | 'factual' | 'demonstration' | 'decoration' | 'none' mustInclude?: string[] avoidElements?: string[] imageFit?: 'contain' | 'cover' imageAspectRatio?: number layout?: string visualRole?: string focalContent?: string visualDensity?: "low" | "medium" | "high" | string mainVisual?: string elements?: string[] contentPriority?: string[] imageKeywords?: string[] style?: string } designRequirement?: string teacherTips?: string speakerNotes?: string interaction?: { type: string question: string options?: string[] answer?: string explanation?: string } imageKeywords: string[] image?: { reviewStatus?: 'verified' | 'unverified' reviewReason?: string url: string keyword: string provider: string width?: number height?: number score?: number } resourceBindings?: AiCoursewareResourceBinding[] } export interface AiCoursewareResourceBinding { scoreImageUrl?: string resourceId: string resourceType: "IMG" | "VIDEO" | "SONG" | "MUSIC" | "LISTEN" | "RHYTHM" | "THEORY" | "MUSIC_WIKI" | "INSTRUMENT" | "MUSICIAN" | string name?: string contentUrl?: string coverUrl?: string dataJson?: string elementSubtype?: string purpose?: string dedicatedPage?: boolean required?: boolean verified?: boolean } export interface AiCoursewareTaskInfo { taskId: string status: "PENDING" | "RUNNING" | "DONE" | "DRAFT" | "FAILED" progress: number message: string } export interface AiCoursewareGenerateResult { reviewMessage?: string context: Record outline: AiCoursewareOutline } export const aiCoursewareOutlineApi = (data: AiCoursewareOutlineQuery) => { return httpAxios.axioseRquest({ method: "post", url: "/edu-app/aiCourseware/outline", data }) } export const aiCoursewareGenerateApi = (data: AiCoursewareGenerateQuery) => { return httpAxios.axioseRquest({ method: "post", url: "/edu-app/aiCourseware/generate", data }) } export const aiCoursewareTaskApi = (taskId: string) => { return httpAxios.axioseRquest({ method: "get", url: `/edu-app/aiCourseware/task/${taskId}` }) } export const aiCoursewareResultApi = (taskId: string) => { return httpAxios.axioseRquest({ method: "get", url: `/edu-app/aiCourseware/task/${taskId}/result` }) }