aiCourseware.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. import { httpAxios } from "@/api/ApiInstance"
  2. import type { AiCoursewareTemplateId } from "@/config/aiCoursewareTemplates"
  3. export interface AiCoursewareOutlineQuery {
  4. id: string
  5. fromType?: string
  6. extraPrompt?: string
  7. preferences?: AiCoursewarePreferences
  8. }
  9. export interface AiCoursewareGenerateQuery {
  10. extraPrompt?: string
  11. imageAspectRatios?: Record<string, number>
  12. id: string
  13. fromType?: string
  14. outline: AiCoursewareOutline
  15. templateId?: AiCoursewareTemplateId
  16. visualPrompt?: string
  17. preferences?: AiCoursewarePreferences
  18. regeneratePageNo?: number
  19. repairOnly?: boolean
  20. outlineConfirmed?: boolean
  21. outlineMode?: 'teaching_plan'
  22. }
  23. export interface AiCoursewarePreferences {
  24. teachingApproach?: 'auto' | 'inquiry' | 'story' | 'practice'
  25. resourceMode?: 'teacher_supplement' | 'auto_bind'
  26. learningContext?: string
  27. lessonScope?: string
  28. lessonMinutes: number
  29. minPages: number
  30. maxPages: number
  31. assetStyle: "illustration" | "photo" | "mixed"
  32. sourceImagePolicy: "strict" | "balanced" | "creative"
  33. requireAudio: boolean
  34. requireVideo: boolean
  35. enableAnimations: boolean
  36. }
  37. export interface AiCoursewareOutline {
  38. teachingDesign?: {
  39. approach: string
  40. drivingQuestion: string
  41. learningPath: string[]
  42. consistencyRules?: string[]
  43. }
  44. teacherRequirements?: string
  45. title: string
  46. templateId?: AiCoursewareTemplateId
  47. gradeName: string
  48. textbookName: string
  49. unitName: string
  50. chapterName: string
  51. courseType: string
  52. style: "cartoon" | "clean" | string
  53. visualBible?: AiCoursewareVisualBible
  54. textbookResearch?: AiCoursewareTextbookResearch
  55. pages: AiCoursewarePage[]
  56. }
  57. export interface AiCoursewareVisualBible {
  58. artStyle?: string
  59. palette?: string[]
  60. environment?: string
  61. lighting?: string
  62. recurringProps?: string[]
  63. characters?: Array<{
  64. name: string
  65. appearance?: string
  66. costume?: string
  67. signatureColor?: string
  68. }>
  69. }
  70. export interface AiCoursewareTextbookResearch {
  71. exactMatch: boolean
  72. confidence: "HIGH" | "MEDIUM" | "LOW" | string
  73. courseType: string
  74. contentSummary: string
  75. works: string[]
  76. verifiedFacts: string[]
  77. teachingObjectives: string[]
  78. teachingFocus: string[]
  79. learningActivities: string[]
  80. missingEvidence: string[]
  81. sources: Array<{
  82. index?: number
  83. title?: string
  84. url: string
  85. official?: boolean
  86. }>
  87. }
  88. export interface AiCoursewarePage {
  89. imageReview?: string
  90. imageStatus?: 'not_required' | 'ready' | 'budget_exhausted' | 'generation_failed' | 'review_rejected' | 'reference_missing' | 'unavailable'
  91. /** 教师确认的教学安排,指导扩写,不直接作为学生可见正文。 */
  92. teachingBrief?: string
  93. pageNo: number
  94. type: string
  95. title: string
  96. subtitle?: string
  97. bullets: string[]
  98. teachingStage?: string
  99. teachingPurpose?: string
  100. learningEvidence?: string
  101. durationMinutes?: number
  102. objectiveIds?: string[]
  103. optional?: boolean
  104. requiredVisual?: boolean
  105. studentContent?: {
  106. headline?: string
  107. points?: string[]
  108. steps?: string[]
  109. comparisonGroups?: Array<{ label: string; points: string[] }>
  110. }
  111. activity?: {
  112. task?: string
  113. steps?: string[]
  114. }
  115. classroomAction?: {
  116. teacherInstruction?: string
  117. studentTask?: string
  118. interactionType?: string
  119. modelExample?: string
  120. successCriteria?: string
  121. storyScript?: string
  122. }
  123. diagram?: {
  124. kind: 'beats' | 'duration' | 'pitch' | 'sequence'
  125. caption: string
  126. basis?: string
  127. items: Array<{ label: string; value?: number }>
  128. }
  129. visual?: {
  130. layout?: string
  131. style?: string
  132. mainVisual?: string
  133. imageKeywords?: string[]
  134. }
  135. visualPlan?: {
  136. composition?: 'full_scene' | 'image_left' | 'image_right' | 'image_top' | 'comparison' | 'steps' | 'focus_question' | 'concept_grid'
  137. visualMode?: 'generated_image' | 'reference_image' | 'native_diagram' | 'text_only'
  138. imageNecessity?: 'essential' | 'supporting' | 'optional' | 'none'
  139. imageReason?: string
  140. visualShare?: number
  141. textPresentation?: 'plain' | 'cards' | 'steps' | 'grid'
  142. imagePurpose?: 'scene' | 'observation' | 'comparison' | 'factual' | 'demonstration' | 'decoration' | 'none'
  143. mustInclude?: string[]
  144. avoidElements?: string[]
  145. imageFit?: 'contain' | 'cover'
  146. imageAspectRatio?: number
  147. layout?: string
  148. visualRole?: string
  149. focalContent?: string
  150. visualDensity?: "low" | "medium" | "high" | string
  151. mainVisual?: string
  152. elements?: string[]
  153. contentPriority?: string[]
  154. imageKeywords?: string[]
  155. style?: string
  156. }
  157. designRequirement?: string
  158. teacherTips?: string
  159. speakerNotes?: string
  160. interaction?: {
  161. type: string
  162. question: string
  163. options?: string[]
  164. answer?: string
  165. explanation?: string
  166. }
  167. imageKeywords: string[]
  168. image?: {
  169. reviewStatus?: 'verified' | 'unverified'
  170. reviewReason?: string
  171. url: string
  172. keyword: string
  173. provider: string
  174. width?: number
  175. height?: number
  176. score?: number
  177. }
  178. resourceBindings?: AiCoursewareResourceBinding[]
  179. }
  180. export interface AiCoursewareResourceBinding {
  181. scoreImageUrl?: string
  182. resourceId: string
  183. resourceType: "IMG" | "VIDEO" | "SONG" | "MUSIC" | "LISTEN" | "RHYTHM" | "THEORY" | "MUSIC_WIKI" | "INSTRUMENT" | "MUSICIAN" | string
  184. name?: string
  185. contentUrl?: string
  186. coverUrl?: string
  187. dataJson?: string
  188. elementSubtype?: string
  189. purpose?: string
  190. dedicatedPage?: boolean
  191. required?: boolean
  192. verified?: boolean
  193. }
  194. export interface AiCoursewareTaskInfo {
  195. taskId: string
  196. status: "PENDING" | "RUNNING" | "DONE" | "DRAFT" | "FAILED"
  197. progress: number
  198. message: string
  199. }
  200. export interface AiCoursewareGenerateResult {
  201. reviewMessage?: string
  202. context: Record<string, any>
  203. outline: AiCoursewareOutline
  204. }
  205. export const aiCoursewareOutlineApi = (data: AiCoursewareOutlineQuery) => {
  206. return httpAxios.axioseRquest({
  207. method: "post",
  208. url: "/edu-app/aiCourseware/outline",
  209. data
  210. })
  211. }
  212. export const aiCoursewareGenerateApi = (data: AiCoursewareGenerateQuery) => {
  213. return httpAxios.axioseRquest({
  214. method: "post",
  215. url: "/edu-app/aiCourseware/generate",
  216. data
  217. })
  218. }
  219. export const aiCoursewareTaskApi = (taskId: string) => {
  220. return httpAxios.axioseRquest({
  221. method: "get",
  222. url: `/edu-app/aiCourseware/task/${taskId}`
  223. })
  224. }
  225. export const aiCoursewareResultApi = (taskId: string) => {
  226. return httpAxios.axioseRquest({
  227. method: "get",
  228. url: `/edu-app/aiCourseware/task/${taskId}/result`
  229. })
  230. }