openapi: 3.1.0 info: title: Artemis Application Server API contact: {name: Stephan Krusche, email: krusche@tum.de} version: "9.9" servers: - {url: 'http://localhost:8080', description: Generated server url} tags: - {name: Global Search Resource, description: 'Weaviate-based semantic search across courses, exercises, lectures, lecture units, exams, FAQs, and public communication channels including their messages and replies'} paths: /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}: get: tags: [tutorial-group] operationId: getTutorialGroup parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupDetailData'} put: tags: [tutorial-group] operationId: updateTutorialGroup parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/CreateOrUpdateTutorialGroupRequest'} required: true responses: '200': {description: OK} delete: tags: [tutorial-group] operationId: deleteTutorialGroup parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} responses: '200': {description: OK} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/sessions/{sessionId}: put: tags: [tutorial-group-session] operationId: updateSession parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} - name: sessionId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/CreateOrUpdateTutorialGroupSessionRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupSession'} delete: tags: [tutorial-group-session] operationId: deleteSession parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} - name: sessionId in: path required: true schema: {type: integer, format: int64} responses: '200': {description: OK} /api/tutorialgroup/courses/{courseId}/tutorial-groups-configuration/{tutorialGroupsConfigurationId}: put: tags: [tutorial-groups-configuration] operationId: update parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupsConfigurationId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupConfiguration'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupConfiguration'} ? /api/tutorialgroup/courses/{courseId}/tutorial-groups-configuration/{tutorialGroupsConfigurationId}/tutorial-free-periods/{tutorialGroupFreePeriodId} : get: tags: [tutorial-group-free-period] operationId: getOneOfConfiguration parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupsConfigurationId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupFreePeriodId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupFreePeriod'} put: tags: [tutorial-group-free-period] operationId: update_1 parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupsConfigurationId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupFreePeriodId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupFreePeriodRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupFreePeriod'} delete: tags: [tutorial-group-free-period] operationId: delete parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupsConfigurationId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupFreePeriodId in: path required: true schema: {type: integer, format: int64} responses: '200': {description: OK} /api/tutorialgroup/courses/{courseId}/tutorial-groups: get: tags: [tutorial-group] operationId: getTutorialGroupsForCourse parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {type: array} post: tags: [tutorial-group] operationId: createTutorialGroup parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/CreateOrUpdateTutorialGroupRequest'} required: true responses: '200': description: OK content: application/json: schema: {type: integer, format: int64} /api/quiz/leaderboard-settings: get: tags: [quiz-training] operationId: getLeaderboardSettings responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/LeaderboardSetting'} put: tags: [quiz-training] operationId: updateLeaderboardSettings requestBody: content: application/json: schema: {$ref: '#/components/schemas/LeaderboardSetting'} required: true responses: '200': {description: OK} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/sessions: post: tags: [tutorial-group-session] operationId: createSession parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/CreateOrUpdateTutorialGroupSessionRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupSession'} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/import-registrations: post: tags: [tutorial-group] operationId: importRegistrations parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupStudentImportData'} required: true responses: '200': description: OK content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupStudentImportData'} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/batch-register: post: tags: [tutorial-group] operationId: batchRegisterStudents parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: type: array items: {type: string} required: true responses: '200': {description: OK} /api/tutorialgroup/courses/{courseId}/tutorial-groups/import: post: tags: [tutorial-group] operationId: importTutorialGroupsWithRegistrations parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupImportData'} uniqueItems: true required: true responses: '200': description: OK content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupImportData'} /api/tutorialgroup/courses/{courseId}/tutorial-groups-configuration: get: tags: [tutorial-groups-configuration] operationId: getOneOfCourse parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupConfiguration'} post: tags: [tutorial-groups-configuration] operationId: create parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupConfiguration'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupConfiguration'} /api/tutorialgroup/courses/{courseId}/tutorial-groups-configuration/{tutorialGroupsConfigurationId}/tutorial-free-periods: post: tags: [tutorial-group-free-period] operationId: create_1 parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupsConfigurationId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupFreePeriodRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupFreePeriod'} /api/hyperion/programming-exercises/{exerciseId}/generate-code: post: tags: [hyperion-code-generation] operationId: generateCode parameters: - name: exerciseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/CodeGenerationRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/CodeGenerationJobStart'} /api/quiz/courses/{courseId}/training-questions: post: tags: [quiz-training] operationId: getQuizQuestionsForPractice parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: page in: query description: Zero-based page index (0..N) required: false schema: {type: integer, default: 0, minimum: 0} - name: size in: query description: The size of the page to be returned required: false schema: {type: integer, default: 20, minimum: 1} - name: sort in: query description: 'Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.' required: false schema: type: array items: {type: string} - name: isNewSession in: query required: true schema: {type: boolean} requestBody: content: application/json: schema: type: array items: {type: integer, format: int64} uniqueItems: true required: true responses: '200': description: OK headers: X-Has-Next: style: simple schema: {type: boolean} content: application/json: schema: type: array items: {$ref: '#/components/schemas/QuizQuestionTraining'} /api/quiz/courses/{courseId}/training-questions/{trainingQuestionId}/submit: post: tags: [quiz-training] operationId: submitForTraining parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: trainingQuestionId in: path required: true schema: {type: integer, format: int64} - name: isRated in: query required: true schema: {type: boolean} requestBody: content: application/json: schema: {$ref: '#/components/schemas/SubmittedAnswerFromLiveClient'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/SubmittedAnswerAfterEvaluation'} /api/quiz/courses/{courseId}/leaderboard-entry: post: tags: [quiz-training] operationId: initializeLeaderboardEntry parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/LeaderboardSetting'} required: true responses: '200': {description: OK} /api/hyperion/programming-exercises/{exerciseId}/consistency-check: post: tags: [hyperion-problem-statement] operationId: checkExerciseConsistency parameters: - name: exerciseId in: path required: true schema: {type: integer, format: int64} - name: skipThreadContext in: query required: false schema: {type: boolean, default: false} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ConsistencyCheckResponse'} /api/hyperion/courses/{courseId}/quiz-exercises/refine-question: post: tags: [hyperion-quiz-question-generation] operationId: refineQuizQuestion parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/QuizQuestionRefinementRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/QuizQuestionRefinementResponse'} /api/hyperion/courses/{courseId}/quiz-exercises/refine-all-questions: post: tags: [hyperion-quiz-question-generation] operationId: refineAllQuizQuestions parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/QuizQuestionBulkRefinementRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/QuizQuestionBulkRefinementResponse'} /api/hyperion/courses/{courseId}/quiz-exercises/generate-questions: post: tags: [hyperion-quiz-question-generation] operationId: generateQuizQuestions parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/QuizQuestionGenerationRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/QuizQuestionGenerationResponse'} /api/hyperion/courses/{courseId}/problem-statements/rewrite: post: tags: [hyperion-problem-statement] operationId: rewriteProblemStatement parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementRewriteRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementRewriteResponse'} /api/hyperion/courses/{courseId}/problem-statements/refine/targeted: post: tags: [hyperion-problem-statement] operationId: refineProblemStatementTargeted parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementTargetedRefinementRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementRefinementResponse'} /api/hyperion/courses/{courseId}/problem-statements/refine/global: post: tags: [hyperion-problem-statement] operationId: refineProblemStatementGlobally parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementGlobalRefinementRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementRefinementResponse'} /api/hyperion/courses/{courseId}/problem-statements/generate: post: tags: [hyperion-problem-statement] operationId: generateProblemStatement parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementGenerationRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementGenerationResponse'} /api/hyperion/courses/{courseId}/faq/rewrite: post: tags: [hyperion-faq] operationId: rewriteFaq parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/RewriteFaqRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/RewriteFaqResponse'} /api/hyperion/courses/{courseId}/checklist-analysis: post: tags: [hyperion-problem-statement] operationId: analyzeChecklist parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/ChecklistAnalysisRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ChecklistAnalysisResponse'} /api/hyperion/courses/{courseId}/checklist-analysis/sections/{section}: post: tags: [hyperion-problem-statement] operationId: analyzeChecklistSection parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: section in: path required: true schema: type: string enum: [COMPETENCIES, DIFFICULTY, QUALITY] requestBody: content: application/json: schema: {$ref: '#/components/schemas/ChecklistAnalysisRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ChecklistAnalysisResponse'} /api/hyperion/courses/{courseId}/checklist-actions: post: tags: [hyperion-problem-statement] operationId: applyChecklistAction parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/ChecklistActionRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ChecklistActionResponse'} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/sessions/{sessionId}/cancel: patch: tags: [tutorial-group-session] operationId: cancelSession parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} - name: sessionId in: path required: true schema: {type: integer, format: int64} - name: explanation in: query required: false schema: {type: string} responses: '200': {description: OK} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/sessions/{sessionId}/activate: patch: tags: [tutorial-group-session] operationId: activateSession parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} - name: sessionId in: path required: true schema: {type: integer, format: int64} responses: '200': {description: OK} /api/tutorialgroup/tutorial-groups/{tutorialGroupId}/title: get: tags: [tutorial-group] operationId: getTitle parameters: - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {type: string} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/unregistered-students: get: tags: [tutorial-group] operationId: searchUnregisteredStudents parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} - name: loginOrName in: query required: true schema: {type: string} - name: pageIndex in: query required: true schema: {type: integer, format: int32} - name: pageSize in: query required: true schema: {type: integer, format: int32} responses: '200': description: OK content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupStudent'} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/schedule: get: tags: [tutorial-group] operationId: getTutorialGroupSchedule parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupSchedule'} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/registered-students: get: tags: [tutorial-group] operationId: getRegisteredStudents parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupStudent'} uniqueItems: true /api/tutorialgroup/courses/{courseId}/tutorial-groups/language-values: get: tags: [tutorial-group] operationId: getUniqueLanguageValues parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: type: array items: {type: string} uniqueItems: true /api/tutorialgroup/courses/{courseId}/tutorial-groups/export/json: get: tags: [tutorial-group] operationId: exportTutorialGroupsToJSON parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: fields in: query required: true schema: type: array items: {type: string} responses: '200': description: OK content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupExportData'} /api/tutorialgroup/courses/{courseId}/tutorial-groups/export/csv: get: tags: [tutorial-group] operationId: exportTutorialGroupsToCSV parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: fields in: query required: true schema: type: array items: {type: string} responses: '200': description: OK content: text/csv: schema: {type: string, format: binary} /api/search: get: tags: [Global Search] summary: Perform a unified semantic search across entity types description: |- Searches across multiple entity types (exercises, lectures, lecture units, exams, FAQs, channels, courses, posts, answer posts) with a consistent response format. When courseId is not specified, the search is performed globally across all courses the authenticated user has access to. Per-type access rules are enforced server-side via compound Weaviate filters. operationId: globalSearch parameters: - name: q in: query description: Search query; can be empty to retrieve recent items required: true schema: {type: string} - name: types in: query description: Comma-separated entity type filter (exercise, lecture, lecture_unit, exam, faq, channel, course, post, answer_post) or 'all'; default 'all' required: false schema: {type: string} - name: courseId in: query description: Course ID to restrict the search to a single course required: false schema: {type: integer, format: int64} - name: limit in: query description: Maximum number of results (1–25, default 10) required: false schema: {type: integer, format: int32, default: 10} responses: '200': description: Search results matching the query content: application/json: schema: type: array items: {$ref: '#/components/schemas/GlobalSearchResult'} '400': description: Unsupported entity type requested content: application/json: schema: type: array items: {$ref: '#/components/schemas/GlobalSearchResult'} /api/quiz/courses/{courseId}/training/leaderboard: get: tags: [quiz-training] operationId: getQuizTrainingLeaderboard parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/LeaderboardWithCurrentUserEntry'} /api/core/calendar/courses/{courseId}/calendar-events-ics: get: tags: [legacy-calendar] operationId: getLegacyCalendarEventSubscriptionFile parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: token in: query required: true schema: {type: string} - name: filterOptions in: query required: true schema: type: array items: type: string enum: [LECTURES, TUTORIALS, EXAMS, EXERCISES] uniqueItems: true - name: language in: query required: true schema: type: string enum: [ENGLISH, GERMAN] responses: '200': description: OK content: text/calendar: schema: {type: string} deprecated: true /api/calendar/subscription-token: get: tags: [calendar] operationId: getCalendarEventSubscriptionToken responses: '200': description: OK content: text/plain: schema: {type: string} /api/calendar/courses/{courseId}/calendar-events: get: tags: [calendar] summary: Get calendar events grouped by month operationId: getCalendarEventsOverlappingMonths parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: monthKeys in: query required: true schema: type: array items: {type: string} - name: timeZone in: query required: true schema: {type: string} - name: language in: query required: true schema: type: string enum: [ENGLISH, GERMAN] responses: '200': description: OK content: application/json: schema: type: object additionalProperties: type: array items: {$ref: '#/components/schemas/CalendarEvent'} /api/calendar/courses/{courseId}/calendar-events-ics: get: tags: [calendar] operationId: getCalendarEventSubscriptionFile parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: token in: query required: true schema: {type: string} - name: filterOptions in: query required: true schema: type: array items: type: string enum: [LECTURES, TUTORIALS, EXAMS, EXERCISES] uniqueItems: true - name: language in: query required: true schema: type: string enum: [ENGLISH, GERMAN] responses: '200': description: OK content: text/calendar: schema: {type: string} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/deregister/{studentLogin}: delete: tags: [tutorial-group] operationId: deregisterStudent parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} - name: studentLogin in: path required: true schema: {type: string} responses: '200': {description: OK} components: schemas: TutorialGroupStudentImportData: type: object properties: login: {type: string, maxLength: 50, minLength: 0} registrationNumber: {type: string, maxLength: 10, minLength: 0} QuizQuestionRefinementSuccess: description: Successful refinement result containing the refined question and an explanation of the changes required: [question, reasoning] type: object properties: reasoning: {type: string, description: Brief explanation of what was changed during refinement, minLength: 1} type: type: string enum: [success] example: success ChecklistAnalysisRequest: type: object description: Request to analyze a problem statement for quality, competencies, and difficulty properties: problemStatementMarkdown: {type: string, description: Problem statement in Markdown format, maxLength: 50000, minLength: 1} declaredDifficulty: {type: string, description: Declared difficulty of the exercise, maxLength: 20, minLength: 0, pattern: EASY|MEDIUM|HARD} language: {type: string, description: 'Programming language, e.g. JAVA, PYTHON', maxLength: 50, minLength: 0} exerciseId: {type: integer, format: int64, description: ID of the exercise} required: [problemStatementMarkdown] ChecklistActionRequest: type: object description: Request to apply an AI-powered checklist action to the problem statement properties: actionType: type: string description: Type of action to apply enum: [FIX_QUALITY_ISSUE, FIX_ALL_QUALITY_ISSUES, ADAPT_DIFFICULTY] problemStatementMarkdown: {type: string, description: Current problem statement markdown, maxLength: 50000, minLength: 1} context: type: object additionalProperties: {type: string} description: Action-specific context parameters required: [actionType, problemStatementMarkdown] ChecklistAnalysisResponse: type: object description: Response containing the checklist analysis results properties: inferredCompetencies: type: array description: Top inferred competencies from the standardized catalog items: {$ref: '#/components/schemas/InferredCompetency'} bloomRadar: {$ref: '#/components/schemas/BloomRadar', description: Bloom's taxonomy radar distribution} difficultyAssessment: {$ref: '#/components/schemas/DifficultyAssessment', description: Difficulty assessment with delta indicator} qualityIssues: type: array description: List of quality issues found in the problem statement items: {$ref: '#/components/schemas/QualityIssue'} ChecklistActionResponse: type: object description: Response from applying a checklist action to the problem statement properties: updatedProblemStatement: {type: string, description: The updated problem statement markdown} applied: {type: boolean, description: Whether the action was successfully applied} summary: {type: string, description: Short summary of what was changed} SubmittedAnswerFromLiveClient: discriminator: propertyName: type mapping: {multiple-choice: '#/components/schemas/MultipleChoiceSubmittedAnswerFromLiveClient', drag-and-drop: '#/components/schemas/DragAndDropSubmittedAnswerFromLiveClient', short-answer: '#/components/schemas/ShortAnswerSubmittedAnswerFromLiveClient'} oneOf: - {$ref: '#/components/schemas/MultipleChoiceSubmittedAnswerFromLiveClient'} - {$ref: '#/components/schemas/DragAndDropSubmittedAnswerFromLiveClient'} - {$ref: '#/components/schemas/ShortAnswerSubmittedAnswerFromLiveClient'} properties: type: {type: string} required: [type] CreateOrUpdateTutorialGroupRequest: type: object properties: title: {type: string, pattern: '^[A-Za-z0-9][A-Za-z0-9: -]{0,19}$'} tutorId: {type: integer, format: int64} language: {type: string, maxLength: 255, minLength: 1} isOnline: {type: boolean} campus: {type: string, maxLength: 255, minLength: 1} capacity: {type: integer, format: int32} additionalInformation: {type: string, maxLength: 255, minLength: 1} tutorialGroupSchedule: {$ref: '#/components/schemas/TutorialGroupSchedule'} required: [language, title] ShortAnswerMapping: type: object properties: id: {type: integer, format: int64} shortAnswerSpotIndex: {type: integer, format: int32} shortAnswerSolutionIndex: {type: integer, format: int32} invalid: {type: boolean} solution: {$ref: '#/components/schemas/ShortAnswerSolution'} spot: {$ref: '#/components/schemas/ShortAnswerSpot'} ProblemStatementTargetedRefinementRequest: type: object description: Request to refine a problem statement using targeted selection-based instructions properties: problemStatementText: {type: string, description: 'Original problem statement text to be refined (max 50,000 chars)', maxLength: 50000, minLength: 1} startLine: {type: integer, format: int32, description: Start line number (1-indexed), maximum: 10000, minimum: 1} endLine: {type: integer, format: int32, description: 'End line number (1-indexed, inclusive)', maximum: 10000, minimum: 1} startColumn: {type: integer, format: int32, description: 'Start column within start line (1-indexed, optional for character-level targeting)', maximum: 10000, minimum: 1} endColumn: {type: integer, format: int32, description: 'End column within end line (1-indexed, exclusive — points after the last selected character, optional for character-level targeting)', maximum: 10000, minimum: 1} instruction: {type: string, description: Instruction describing what should change, maxLength: 500, minLength: 1} required: [endLine, instruction, problemStatementText, startLine] QuizQuestionWithSolution: type: object discriminator: propertyName: type mapping: {multiple-choice: '#/components/schemas/MultipleChoiceQuizQuestionWithSolution', drag-and-drop: '#/components/schemas/DragAndDropQuizQuestionWithSolution', short-answer: '#/components/schemas/ShortAnswerQuizQuestionWithSolution'} oneOf: - {$ref: '#/components/schemas/MultipleChoiceQuizQuestionWithSolution'} - {$ref: '#/components/schemas/DragAndDropQuizQuestionWithSolution'} - {$ref: '#/components/schemas/ShortAnswerQuizQuestionWithSolution'} properties: id: {type: integer, format: int64} title: {type: string} text: {type: string} hint: {type: string} points: {type: number, format: double} scoringType: type: string enum: [ALL_OR_NOTHING, PROPORTIONAL_WITH_PENALTY, PROPORTIONAL_WITHOUT_PENALTY] randomizeOrder: {type: boolean} invalid: {type: boolean} type: {type: string} explanation: {type: string} answerOptions: type: array items: {$ref: '#/components/schemas/AnswerOptionWithSolution'} singleChoice: {type: boolean} backgroundFilePath: {type: string} dropLocations: type: array items: {$ref: '#/components/schemas/DropLocation'} dragItems: type: array items: {$ref: '#/components/schemas/DragItem'} correctMappings: type: array items: {$ref: '#/components/schemas/ShortAnswerMapping'} spots: type: array items: {$ref: '#/components/schemas/ShortAnswerSpot'} solutions: type: array items: {$ref: '#/components/schemas/ShortAnswerSolution'} similarityValue: {type: integer, format: int32} matchLetterCase: {type: boolean} TutorialGroupExportData: type: object properties: id: {type: integer, format: int64} title: {type: string} dayOfWeek: {type: string} startTime: {type: string} endTime: {type: string} location: {type: string} campus: {type: string} language: {type: string} additionalInformation: {type: string} capacity: {type: integer, format: int32} isOnline: {type: boolean} students: type: array items: {$ref: '#/components/schemas/StudentExport'} BloomRadar: type: object description: Bloom's taxonomy radar distribution with normalized proportions (0.0–1.0, summing to 1.0) properties: REMEMBER: {type: number, format: double, description: Proportion of REMEMBER level (0.0–1.0)} UNDERSTAND: {type: number, format: double, description: Proportion of UNDERSTAND level (0.0–1.0)} APPLY: {type: number, format: double, description: Proportion of APPLY level (0.0–1.0)} ANALYZE: {type: number, format: double, description: Proportion of ANALYZE level (0.0–1.0)} EVALUATE: {type: number, format: double, description: Proportion of EVALUATE level (0.0–1.0)} CREATE: {type: number, format: double, description: Proportion of CREATE level (0.0–1.0)} ShortAnswerSpot: type: object properties: id: {type: integer, format: int64} spotNr: {type: integer, format: int32} width: {type: integer, format: int32} invalid: {type: boolean} CodeGenerationJobStart: type: object properties: jobId: {type: string} repositoryType: type: string enum: [exercise, solution, tests, auxiliary, user] QuizQuestionRefinementRequest: type: object description: Request to refine an existing quiz question using a user prompt properties: refinementPrompt: {type: string, description: User instructions describing how the question should be changed, maxLength: 2000, minLength: 1} required: [question, refinementPrompt] ConsistencyIssue: type: object description: Individual consistency issue details properties: severity: type: string description: Severity of the issue enum: [LOW, MEDIUM, HIGH] example: HIGH category: type: string description: Category of the issue enum: [METHOD_RETURN_TYPE_MISMATCH, METHOD_PARAMETER_MISMATCH, CONSTRUCTOR_PARAMETER_MISMATCH, ATTRIBUTE_TYPE_MISMATCH, VISIBILITY_MISMATCH, IDENTIFIER_NAMING_INCONSISTENCY] example: METHOD_RETURN_TYPE_MISMATCH description: {type: string, description: Detailed description of the issue, example: Problem statement does not match test cases} suggestedFix: {type: string, description: Suggested fix for the issue, example: Update problem statement to clarify expected behavior} relatedLocations: type: array description: Related locations across artifacts items: {$ref: '#/components/schemas/ArtifactLocation'} required: [category, description, relatedLocations, severity, suggestedFix] ProblemStatementRewriteRequest: type: object description: Request to rewrite a problem statement properties: problemStatementText: {type: string, description: Original problem statement text to be improved, minLength: 1} required: [problemStatementText] LeaderboardSetting: type: object properties: showInLeaderboard: {type: boolean} DropLocation: type: object properties: id: {type: integer, format: int64} posX: {type: number, format: double} posY: {type: number, format: double} width: {type: number, format: double} height: {type: number, format: double} invalid: {type: boolean} Tokens: type: object description: Response containing consistency check tokens properties: prompt: {type: integer, format: int64, description: Prompt token length, example: 10204} completion: {type: integer, format: int64, description: Completion token length, example: 3753} total: {type: integer, format: int64, description: Total token length, example: 13957} DragAndDropQuizQuestionWithSolution: type: object properties: id: {type: integer, format: int64} title: {type: string} text: {type: string} hint: {type: string} points: {type: number, format: double} scoringType: type: string enum: [ALL_OR_NOTHING, PROPORTIONAL_WITH_PENALTY, PROPORTIONAL_WITHOUT_PENALTY] randomizeOrder: {type: boolean} invalid: {type: boolean} type: {type: string} explanation: {type: string} backgroundFilePath: {type: string} dropLocations: type: array items: {$ref: '#/components/schemas/DropLocation'} dragItems: type: array items: {$ref: '#/components/schemas/DragItem'} correctMappings: type: array items: {$ref: '#/components/schemas/DragAndDropMapping'} ProblemStatementRewriteResponse: type: object description: Response containing rewritten problem statement properties: rewrittenText: {type: string, description: Improved problem statement text} improved: {type: boolean, description: Whether the text was actually improved, example: true} required: [improved, rewrittenText] EntityIdRef: type: object properties: id: {type: integer, format: int64} Channel: type: object properties: type: {type: string} id: {type: integer, format: int64} creationDate: {type: string, format: date-time} lastMessageDate: {type: string, format: date-time} creator: {$ref: '#/components/schemas/ConversationUser'} lastReadDate: {type: string, format: date-time} unreadMessagesCount: {type: integer, format: int64} isFavorite: {type: boolean} isHidden: {type: boolean} isMuted: {type: boolean} isCreator: {type: boolean} isMember: {type: boolean} numberOfMembers: {type: integer, format: int32} name: {type: string} description: {type: string} topic: {type: string} isPublic: {type: boolean} isAnnouncementChannel: {type: boolean} isArchived: {type: boolean} isCourseWide: {type: boolean} hasChannelModerationRights: {type: boolean} isChannelModerator: {type: boolean} tutorialGroupId: {type: integer, format: int64} tutorialGroupTitle: {type: string} subType: type: string enum: [general, exercise, lecture, exam, feedbackDiscussion] subTypeReferenceId: {type: integer, format: int64} subTypeWithReferenceFromChannel: {$ref: '#/components/schemas/Channel', writeOnly: true} ShortAnswerQuizQuestionWithSolution: type: object properties: id: {type: integer, format: int64} title: {type: string} text: {type: string} hint: {type: string} points: {type: number, format: double} scoringType: type: string enum: [ALL_OR_NOTHING, PROPORTIONAL_WITH_PENALTY, PROPORTIONAL_WITHOUT_PENALTY] randomizeOrder: {type: boolean} invalid: {type: boolean} type: {type: string} explanation: {type: string} spots: type: array items: {$ref: '#/components/schemas/ShortAnswerSpot'} solutions: type: array items: {$ref: '#/components/schemas/ShortAnswerSolution'} similarityValue: {type: integer, format: int32} matchLetterCase: {type: boolean} correctMappings: type: array items: {$ref: '#/components/schemas/ShortAnswerMapping'} Student: type: object properties: login: {type: string, maxLength: 50, minLength: 0} firstName: {type: string, maxLength: 50, minLength: 0} lastName: {type: string, maxLength: 50, minLength: 0} registrationNumber: {type: string, maxLength: 10, minLength: 0} email: {type: string, format: email, maxLength: 100, minLength: 0} isTestUser: {type: boolean} DragItem: type: object properties: id: {type: integer, format: int64} pictureFilePath: {type: string} text: {type: string} invalid: {type: boolean} DragAndDropMappingFromLiveClient: type: object properties: dragItem: {$ref: '#/components/schemas/EntityIdRef'} dropLocation: {$ref: '#/components/schemas/EntityIdRef'} ShortAnswerSolution: type: object properties: id: {type: integer, format: int64} text: {type: string} invalid: {type: boolean} ExamSeat: type: object properties: name: {type: string} condition: type: string enum: [USABLE, NO_TABLE, DEFECT, WHEELCHAIR] x: {type: number, format: double} y: {type: number, format: double} required: [condition, name] TutorialGroupStudent: type: object properties: id: {type: integer, format: int64} name: {type: string} profilePictureUrl: {type: string} login: {type: string} email: {type: string} registrationNumber: {type: string} required: [id, login] TutorialGroupDetailData: type: object properties: id: {type: integer, format: int64} title: {type: string} language: {type: string} isOnline: {type: boolean} tutorName: {type: string} tutorLogin: {type: string} tutorId: {type: integer, format: int64} tutorImageUrl: {type: string} capacity: {type: integer, format: int32} campus: {type: string} additionalInformation: {type: string} groupChannelId: {type: integer, format: int64} tutorChatId: {type: integer, format: int64} sessions: type: array items: {$ref: '#/components/schemas/TutorialGroupSession'} required: [id, isOnline, language, sessions, title, tutorId, tutorLogin, tutorName] DragAndDropSubmittedAnswerFromLiveClient: required: [type] type: object properties: quizQuestion: {$ref: '#/components/schemas/EntityIdRef'} mappings: type: array items: {$ref: '#/components/schemas/DragAndDropMappingFromLiveClient'} uniqueItems: true type: type: string default: drag-and-drop enum: [drag-and-drop] QualityIssueLocation: type: object description: Location of a quality issue within the problem statement properties: startLine: {type: integer, format: int32, description: Starting line number (1-indexed)} endLine: {type: integer, format: int32, description: 'Ending line number (1-indexed, inclusive)'} TutorialGroupFreePeriodRequest: type: object properties: startDate: {type: string, format: date-time} endDate: {type: string, format: date-time} reason: {type: string} required: [endDate, startDate] ArtifactLocation: type: object description: Location information for artifacts properties: type: type: string description: Type of artifact enum: [PROBLEM_STATEMENT, TEMPLATE_REPOSITORY, SOLUTION_REPOSITORY, TESTS_REPOSITORY] example: PROBLEM_STATEMENT filePath: {type: string, description: 'Path to file, empty or problem_statement.md for problem statement', example: src/main/java/Main.java} startLine: {type: integer, format: int32, description: Start line number (1-based)} endLine: {type: integer, format: int32, description: End line number (1-based)} suggestedInlineFix: type: [string, 'null'] description: Optional inline replacement code for this location required: [endLine, filePath, startLine, type] RewriteFaqResponse: type: object description: Response containing rewritten FAQ properties: rewrittenText: {type: string} inconsistencies: type: array items: {type: string} suggestions: type: array items: {type: string} improvement: {type: string} required: [improvement, inconsistencies, rewrittenText, suggestions] Timing: type: object description: Response containing consistency check timing properties: startTime: {type: string, description: Starting time, example: !!timestamp '2025-07-27T07:17:05.500Z'} endTime: {type: string, description: Ending time, example: !!timestamp '2025-07-27T07:17:05.500Z'} durationS: {type: number, format: double, description: Duration of consistency check, example: 27.765} RewriteFaqRequest: type: object description: Request to rewrite a FAQ properties: faqText: {type: string, minLength: 1} required: [faqText] DifficultyAssessment: type: object properties: suggested: type: string enum: [EASY, MEDIUM, HARD, UNKNOWN] confidence: {type: number, format: double} reasoning: {type: string} matchesDeclared: {type: boolean} delta: type: string enum: [LOWER, MATCH, HIGHER, UNKNOWN] taskCount: {type: integer, format: int32} testCount: {type: integer, format: int32} Costs: type: object description: Response containing consistency check costs properties: promptEur: {type: number, format: double, description: Prompt costs in EUR, example: 0.011224} completionEur: {type: number, format: double, description: Completion costs in EUR, example: 0.016513} totalEur: {type: number, format: double, description: Total costs in EUR, example: 0.027738} TutorialGroupConfiguration: type: object properties: id: {type: integer, format: int64} tutorialPeriodStartInclusive: {type: string, minLength: 1} tutorialPeriodEndInclusive: {type: string, minLength: 1} useTutorialGroupChannels: {type: boolean} usePublicTutorialGroupChannels: {type: boolean} tutorialGroupFreePeriods: type: array items: {$ref: '#/components/schemas/TutorialGroupFreePeriod'} uniqueItems: true required: [tutorialPeriodEndInclusive, tutorialPeriodStartInclusive, usePublicTutorialGroupChannels, useTutorialGroupChannels] DragAndDropMapping: type: object properties: id: {type: integer, format: int64} dragItemIndex: {type: integer, format: int32} dropLocationIndex: {type: integer, format: int32} invalid: {type: boolean} dragItem: {$ref: '#/components/schemas/DragItem'} dropLocation: {$ref: '#/components/schemas/DropLocation'} MultipleChoiceSubmittedAnswerFromLiveClient: required: [type] type: object properties: quizQuestion: {$ref: '#/components/schemas/EntityIdRef'} selectedOptions: type: array items: {$ref: '#/components/schemas/EntityIdRef'} uniqueItems: true type: type: string default: multiple-choice enum: [multiple-choice] ProblemStatementGenerationResponse: type: object description: Response containing generated problem statement properties: draftProblemStatement: {type: string, description: Draft problem statement text} ShortAnswerSubmittedText: type: object properties: id: {type: integer, format: int64} text: {type: string} isCorrect: {type: boolean} spot: {$ref: '#/components/schemas/ShortAnswerSpot'} LeaderboardWithCurrentUserEntry: type: object properties: leaderboardEntries: type: array items: {$ref: '#/components/schemas/LeaderboardEntry'} hasUserSetSettings: {type: boolean} currentUserEntry: {$ref: '#/components/schemas/LeaderboardEntry'} currentTime: {type: string, format: date-time} required: [currentTime, currentUserEntry, leaderboardEntries] QuizQuestionGenerationRequest: type: object description: Request to generate quiz questions. Either topic or competencyIds must be provided. properties: topic: {type: string, description: Main topic for the generated quiz (used in free-topic mode), maxLength: 500, minLength: 1} competencyIds: type: array description: IDs of course competencies to assess (used in competency mode). Either topic or competencyIds must be provided. items: {type: integer, format: int64} minItems: 1 optionalPrompt: {type: string, description: Optional additional instructions, maxLength: 2000, minLength: 0} language: type: string description: Target language for the generated quiz enum: [en, de] questionTypes: type: array description: Question types to include items: type: string enum: [single-choice, multiple-choice, true-false] minItems: 1 uniqueItems: true numberOfQuestions: {type: integer, format: int32, description: Number of questions to generate, maximum: 10, minimum: 1} difficulty: {type: integer, format: int32, description: Difficulty as a value from 0 to 100, maximum: 100, minimum: 0} required: [difficulty, language, numberOfQuestions, questionTypes] GlobalSearchResult: type: object description: Unified search result representing an entity found via global search properties: id: {type: string, description: Unique identifier of the entity} type: {type: string, description: 'Entity type, e.g. ''exercise'', ''lecture'', ''exam'''} title: {type: string, description: Display title of the entity} description: {type: string, description: Short description or body text excerpt} badge: {type: string, description: 'Human-readable badge label, e.g. ''Programming'', ''Quiz'', ''Lecture'''} metadata: type: object additionalProperties: {} description: Additional type-specific metadata such as courseId, dueDate, or points CodeGenerationRequest: type: object properties: repositoryType: type: string enum: [exercise, solution, tests, auxiliary, user] checkOnly: {type: boolean} initialAutoGeneration: {type: boolean} selectedFeedbackThreadIds: type: array items: {type: integer, format: int64} QuizQuestionRefinementResponse: description: Discriminated response for a single quiz question refinement, either a success with the refined question or a failure with an error message discriminator: {propertyName: type} oneOf: - {$ref: '#/components/schemas/QuizQuestionRefinementSuccess'} - {$ref: '#/components/schemas/QuizQuestionRefinementFailure'} properties: type: {type: string} required: [type] InferredCompetency: type: object properties: knowledgeAreaShortTitle: {type: string} competencyTitle: {type: string} competencyVersion: {type: string} catalogSourceId: {type: integer, format: int64} taxonomyLevel: {type: string} confidence: {type: number, format: double} rank: {type: integer, format: int32} evidence: type: array items: {type: string} whyThisMatches: {type: string} isLikelyPrimary: {type: boolean} relatedTaskNames: type: array items: {type: string} matchedCourseCompetencyId: {type: integer, format: int64} QuizQuestionBulkRefinementRequest: type: object description: Request to refine multiple quiz questions at once using a single user prompt properties: questions: {type: array, description: The quiz questions to refine, maxItems: 50, minItems: 1} refinementPrompt: {type: string, description: User instructions describing how all questions should be changed, maxLength: 2000, minLength: 1} required: [questions, refinementPrompt] SubmittedAnswerAfterEvaluation: type: object properties: id: {type: integer, format: int64} scoreInPoints: {type: number, format: double} quizQuestion: {$ref: '#/components/schemas/QuizQuestionWithSolution'} selectedOptions: type: array items: {$ref: '#/components/schemas/AnswerOptionWithSolution'} uniqueItems: true type: {type: string} mappings: type: array items: {$ref: '#/components/schemas/DragAndDropMapping'} uniqueItems: true submittedTexts: type: array items: {$ref: '#/components/schemas/ShortAnswerSubmittedText'} uniqueItems: true ShortAnswerSubmittedTextFromLiveClient: type: object properties: text: {type: string, maxLength: 255, minLength: 0} spot: {$ref: '#/components/schemas/EntityIdRef'} QuizQuestionBulkRefinementResponse: type: object description: Response containing one refinement result per input question, in the same order properties: refinements: type: array description: Refinement results, one per input question in the same order items: {$ref: '#/components/schemas/QuizQuestionRefinementResponse'} required: [refinements] LeaderboardEntry: type: object properties: rank: {type: integer, format: int32} selectedLeague: {type: integer, format: int32} userId: {type: integer, format: int64} userName: {type: string} imageURL: {type: string} score: {type: integer, format: int32} answeredCorrectly: {type: integer, format: int32} answeredWrong: {type: integer, format: int32} totalQuestions: {type: integer, format: int64} dueDate: {type: string, format: date-time} streak: {type: integer, format: int32} required: [dueDate, userName] ProblemStatementRefinementResponse: type: object description: Response containing refined problem statement properties: refinedProblemStatement: {type: string, description: Refined problem statement text} QuizQuestionGenerationResponse: type: object description: Response containing generated quiz questions properties: questions: {type: array, description: Generated quiz questions, minItems: 1} required: [questions] ProblemStatementGenerationRequest: type: object description: Request to generate a problem statement properties: userPrompt: {type: string, description: User prompt describing the problem statement requirements, maxLength: 1000, minLength: 1} required: [userPrompt] TutorialGroupFreePeriod: type: object properties: id: {type: integer, format: int64} start: {type: string} end: {type: string} reason: {type: string} required: [end, start] CalendarEvent: type: object properties: type: type: string enum: [LECTURE, TUTORIAL, EXAM, QUIZ_EXERCISE, TEXT_EXERCISE, MODELING_EXERCISE, PROGRAMMING_EXERCISE, FILE_UPLOAD_EXERCISE] title: {type: string} startDate: {type: string, format: date-time} endDate: {type: string, format: date-time} location: {type: string} facilitator: {type: string} required: [startDate, title, type] QuizQuestionTraining: type: object properties: quizQuestionWithSolutionDTO: {$ref: '#/components/schemas/QuizQuestionWithSolution'} isRated: {type: boolean} questionIds: type: array items: {type: integer, format: int64} uniqueItems: true isNewSession: {type: boolean} id: {type: integer, format: int64} required: [quizQuestionWithSolutionDTO] QualityIssue: type: object description: A quality issue found in the problem statement properties: category: type: string description: 'Issue category: CLARITY, COHERENCE, or COMPLETENESS' enum: [CLARITY, COHERENCE, COMPLETENESS] severity: type: string description: 'Issue severity: LOW, MEDIUM, or HIGH' enum: [LOW, MEDIUM, HIGH] description: {type: string, description: Description of what is wrong} location: {$ref: '#/components/schemas/QualityIssueLocation', description: Location in the problem statement} suggestedFix: {type: string, description: Concrete suggestion to fix the issue} impactOnLearners: {type: string, description: How this issue increases extraneous cognitive load} TutorialGroupImportData: type: object properties: title: {type: string} student: {$ref: '#/components/schemas/Student'} importSuccessful: {type: boolean} error: type: string enum: [NO_TITLE, NO_USER_FOUND, MULTIPLE_REGISTRATIONS] campus: {type: string} capacity: {type: integer, format: int32} language: {type: string} additionalInformation: {type: string} isOnline: {type: boolean} ConsistencyCheckResponse: type: object description: Response containing consistency check results properties: timestamp: {type: string, format: date-time, description: Timestamp of the response generation} issues: type: array description: List of consistency issues found items: {$ref: '#/components/schemas/ConsistencyIssue'} timing: {$ref: '#/components/schemas/Timing', description: Execution timing details} tokens: {$ref: '#/components/schemas/Tokens', description: Token usage statistics} costs: {$ref: '#/components/schemas/Costs', description: Costs statistics} required: [issues, timestamp] TutorialGroupSchedule: type: object properties: firstSessionStart: {type: string, format: date-time} firstSessionEnd: {type: string, format: date-time} repetitionFrequency: {type: integer, format: int32} tutorialPeriodEnd: {type: string, format: date} location: {type: string, maxLength: 255, minLength: 1} required: [firstSessionEnd, firstSessionStart, location, repetitionFrequency, tutorialPeriodEnd] MultipleChoiceQuizQuestionWithSolution: type: object properties: id: {type: integer, format: int64} title: {type: string} text: {type: string} hint: {type: string} points: {type: number, format: double} scoringType: type: string enum: [ALL_OR_NOTHING, PROPORTIONAL_WITH_PENALTY, PROPORTIONAL_WITHOUT_PENALTY] randomizeOrder: {type: boolean} invalid: {type: boolean} type: {type: string} explanation: {type: string} answerOptions: type: array items: {$ref: '#/components/schemas/AnswerOptionWithSolution'} singleChoice: {type: boolean} CreateOrUpdateTutorialGroupSessionRequest: type: object properties: date: {type: string, format: date} startTime: {type: string} endTime: {type: string} location: {type: string, maxLength: 2000, minLength: 1} attendance: {type: integer, format: int32} required: [date, endTime, location, startTime] TutorialGroupSession: type: object properties: id: {type: integer, format: int64} start: {type: string, format: date-time} end: {type: string, format: date-time} location: {type: string, maxLength: 255, minLength: 1} isCancelled: {type: boolean} isCancelledByFreePeriod: {type: boolean} locationChanged: {type: boolean} timeChanged: {type: boolean} dateChanged: {type: boolean} attendanceCount: {type: integer, format: int32} required: [dateChanged, end, id, isCancelled, isCancelledByFreePeriod, location, locationChanged, start, timeChanged] AnswerOptionWithSolution: type: object properties: id: {type: integer, format: int64} text: {type: string} hint: {type: string} invalid: {type: boolean} explanation: {type: string} isCorrect: {type: boolean} ShortAnswerSubmittedAnswerFromLiveClient: required: [type] type: object properties: quizQuestion: {$ref: '#/components/schemas/EntityIdRef'} submittedTexts: type: array items: {$ref: '#/components/schemas/ShortAnswerSubmittedTextFromLiveClient'} uniqueItems: true type: type: string default: short-answer enum: [short-answer] QuizQuestionRefinementFailure: description: Failed refinement result containing an error message required: [error] type: object properties: error: {type: string, description: Error message describing why the refinement failed, minLength: 1} type: type: string enum: [failure] example: failure ConversationUser: type: object properties: id: {type: integer, format: int64} login: {type: string} name: {type: string} firstName: {type: string} lastName: {type: string} imageUrl: {type: string} isInstructor: {type: boolean} isEditor: {type: boolean} isTeachingAssistant: {type: boolean} isStudent: {type: boolean} isChannelModerator: {type: boolean} isRequestingUser: {type: boolean} StudentExport: type: object properties: registrationNumber: {type: string} firstName: {type: string} lastName: {type: string} ProblemStatementGlobalRefinementRequest: type: object description: Request to refine a problem statement globally using a user prompt properties: problemStatementText: {type: string, description: 'Original problem statement text to be refined (max 50,000 chars)', maxLength: 50000, minLength: 1} userPrompt: {type: string, description: User prompt for global refinement, maxLength: 1000, minLength: 1} required: [problemStatementText, userPrompt]