{"openapi":"3.1.0","info":{"title":"Excellence Learning","version":"1.0.0"},"paths":{"/register":{"post":{"tags":["Auth"],"summary":"Register User","description":"Simplified registration endpoint - creates account with minimal info.\nOnboarding data will be collected progressively via /users/me/onboarding endpoint.","operationId":"register_user_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRegisterSimple"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/login":{"post":{"tags":["Auth"],"summary":"Login User","operationId":"login_user_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/refresh":{"post":{"tags":["Auth"],"summary":"Refresh Token Endpoint","operationId":"refresh_token_endpoint_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/logout":{"post":{"tags":["Auth"],"summary":"Logout User","operationId":"logout_user_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/me":{"get":{"tags":["Auth"],"summary":"Get Current User Info","operationId":"get_current_user_info_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/health":{"get":{"tags":["Auth"],"summary":"Health Check","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/reset-password/request":{"post":{"tags":["Auth"],"summary":"Request Password Reset","operationId":"request_password_reset_reset_password_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reset-password/confirm":{"post":{"tags":["Auth"],"summary":"Confirm Password Reset","operationId":"confirm_password_reset_reset_password_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/recover-email":{"post":{"tags":["Auth"],"summary":"Recover Email","description":"Verify an email recovery code and return the associated email address","operationId":"recover_email_recover_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoverEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoverEmailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"tags":["OAuth"],"summary":"Authorization Server Metadata","operationId":"authorization_server_metadata__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource/mcp":{"get":{"tags":["OAuth"],"summary":"Protected Resource Metadata","operationId":"protected_resource_metadata__well_known_oauth_protected_resource_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"tags":["OAuth"],"summary":"Protected Resource Metadata","operationId":"protected_resource_metadata__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/register":{"post":{"tags":["OAuth"],"summary":"Register Client","operationId":"register_client_oauth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientRegistrationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/authorize":{"get":{"tags":["OAuth"],"summary":"Authorize Get","operationId":"authorize_get_oauth_authorize_get","parameters":[{"name":"response_type","in":"query","required":true,"schema":{"type":"string","title":"Response Type"}},{"name":"client_id","in":"query","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","title":"Redirect Uri"}},{"name":"code_challenge","in":"query","required":true,"schema":{"type":"string","title":"Code Challenge"}},{"name":"code_challenge_method","in":"query","required":false,"schema":{"type":"string","default":"S256","title":"Code Challenge Method"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["OAuth"],"summary":"Authorize Post","operationId":"authorize_post_oauth_authorize_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_authorize_post_oauth_authorize_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/token":{"post":{"tags":["OAuth"],"summary":"Token","operationId":"token_oauth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_token_oauth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/feedback":{"post":{"tags":["Feedback"],"summary":"Submit Feedback","operationId":"submit_feedback_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/feedbacks":{"get":{"tags":["Feedback"],"summary":"Get Feedbacks","description":"Get list of all feedbacks with optional status filter","operationId":"get_feedbacks_admin_feedbacks_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["new","in-progress","done"],"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/feedbacks/{feedback_id}":{"get":{"tags":["Feedback"],"summary":"Get Feedback Detail","description":"Get detailed feedback information","operationId":"get_feedback_detail_admin_feedbacks__feedback_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"feedback_id","in":"path","required":true,"schema":{"type":"string","title":"Feedback Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/feedbacks/{feedback_id}/status":{"patch":{"tags":["Feedback"],"summary":"Update Feedback Status","description":"Update feedback status","operationId":"update_feedback_status_admin_feedbacks__feedback_id__status_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"feedback_id","in":"path","required":true,"schema":{"type":"string","title":"Feedback Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__feedback_routes__UpdateStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/feedbacks/{feedback_id}/reply":{"post":{"tags":["Feedback"],"summary":"Send Feedback Reply","description":"Send reply email to user and store it in the feedback","operationId":"send_feedback_reply_admin_feedbacks__feedback_id__reply_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"feedback_id","in":"path","required":true,"schema":{"type":"string","title":"Feedback Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__feedback_routes__SendReplyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics":{"get":{"tags":["Topics"],"summary":"Get Topics","description":"Returns the list of topics based on user's country.\nDefaults to US topics if country is not 'fr'.","operationId":"get_topics_topics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/topics/audio":{"post":{"tags":["Topics"],"summary":"Upload Audio","description":"Uses Whisper to transcribe audio from the user, removes punctuation,\nand returns the cleaned transcript.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_audio_topics_audio_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__topic_routes__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/courses/{topic_name}/conversation":{"post":{"tags":["Courses"],"summary":"Continue Conversation","operationId":"continue_conversation_courses__topic_name__conversation_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"topic_name","in":"path","required":true,"schema":{"type":"string","title":"Topic Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__courses_routes__ConversationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__courses_routes__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/courses/{topic_name}/conversation/stream":{"get":{"tags":["Courses"],"summary":"Continue Conversation Stream","operationId":"continue_conversation_stream_courses__topic_name__conversation_stream_get","parameters":[{"name":"topic_name","in":"path","required":true,"schema":{"type":"string","title":"Topic Name"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/courses/{topic_name}/questions":{"post":{"tags":["Courses"],"summary":"Create Question","description":"Store snippet or question in 'highlights' for user+topic doc.","operationId":"create_question_courses__topic_name__questions_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"topic_name","in":"path","required":true,"schema":{"type":"string","title":"Topic Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HighlightRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__courses_routes__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/courses/{topic_name}/audio":{"post":{"tags":["Courses"],"summary":"Upload Audio","description":"Use shared audio_service to transcribe, then store in conversation_history.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_audio_courses__topic_name__audio_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"topic_name","in":"path","required":true,"schema":{"type":"string","title":"Topic Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__courses_routes__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/courses/{topic_name}/images":{"post":{"tags":["Courses"],"summary":"Upload Image","description":"Example: store \"Image uploaded: <filename>\" in conversation_history.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_image_courses__topic_name__images_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"topic_name","in":"path","required":true,"schema":{"type":"string","title":"Topic Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__courses_routes__ImageUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__courses_routes__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/courses/{topic_name}/graph":{"get":{"tags":["Courses"],"summary":"Get Course Graph","description":"Return the entire course graph from DB if you store it.","operationId":"get_course_graph_courses__topic_name__graph_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"topic_name","in":"path","required":true,"schema":{"type":"string","title":"Topic Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/courses/{topic_name}/mark_nodes_visited":{"post":{"tags":["Courses"],"summary":"Mark Nodes Visited","operationId":"mark_nodes_visited_courses__topic_name__mark_nodes_visited_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"topic_name","in":"path","required":true,"schema":{"type":"string","title":"Topic Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkNodesVisitedRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/courses/list":{"get":{"tags":["Courses"],"summary":"List Courses","operationId":"list_courses_courses_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CourseResponse"},"type":"array","title":"Response List Courses Courses List Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/courses/{course_id}":{"get":{"tags":["Courses"],"summary":"Get Course","description":"Get full details of a single course, including its graph_data.","operationId":"get_course_courses__course_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseCreateRequest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Courses"],"summary":"Update Course","description":"Update an existing course (title, description, or graph_data).","operationId":"update_course_courses__course_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Courses"],"summary":"Delete Course","description":"Delete a course by ID.","operationId":"delete_course_courses__course_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/courses/create":{"post":{"tags":["Courses"],"summary":"Create Course","description":"Create a new course document.","operationId":"create_course_courses_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/courses/{topic_name}/chat-history":{"get":{"tags":["Courses"],"summary":"Get Chat History","description":"Fetch the conversation history for a course topic.","operationId":"get_chat_history_courses__topic_name__chat_history_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"topic_name","in":"path","required":true,"schema":{"type":"string","title":"Topic Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__courses_routes__ChatHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/courses/{topic_name}/conversation/reset":{"post":{"tags":["Courses"],"summary":"Reset Conversation","description":"Archive current conversation and start fresh.","operationId":"reset_conversation_courses__topic_name__conversation_reset_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"topic_name","in":"path","required":true,"schema":{"type":"string","title":"Topic Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__courses_routes__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mentor/add_student":{"post":{"tags":["Mentor"],"summary":"Add Student By Email","description":"Add a given student to the mentor's list by email and privateKey,\nidentified by the mentor token.","operationId":"add_student_by_email_mentor_add_student_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddStudentByEmail"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/mentor/students":{"get":{"tags":["Mentor"],"summary":"Mentor Students","description":"Return the students supervised by the mentor.","operationId":"mentor_students_mentor_students_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/mentor/student/{student_id}":{"get":{"tags":["Mentor"],"summary":"Get Student Summary","description":"Retrieve a summary for a specific student supervised by this mentor.","operationId":"get_student_summary_mentor_student__student_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"student_id","in":"path","required":true,"schema":{"type":"string","title":"Student Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mentor/me":{"get":{"tags":["Mentor"],"summary":"Get Current Mentor Info","operationId":"get_current_mentor_info_mentor_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/threads":{"get":{"tags":["Student"],"summary":"List Student Threads","description":"List all threads where this student is involved.\ni.e. threads.student_id == the student's ID.","operationId":"list_student_threads_student_threads_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Student"],"summary":"Create Thread For Student","description":"POST /student/threads\nBody: { \"title\": \"Some Title\" }\n\nThe student can create a new thread for themselves.\n- threads.student_id = student_id\n- optionally, you might also find the mentor_id if you want\n  to store it, or leave it blank if it's just a student personal thread.","operationId":"create_thread_for_student_student_threads_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__student_chat_routes__CreateThreadRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/threads/messages/{thread_id}":{"get":{"tags":["Student"],"summary":"Get Student Thread Messages","description":"Verify the thread actually belongs to the student_id.\nReturn its messages.","operationId":"get_student_thread_messages_student_threads_messages__thread_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"thread_id","in":"path","required":true,"schema":{"type":"string","title":"Thread Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student/threads/messages":{"post":{"tags":["Student"],"summary":"Student Send Message","description":"Body: { \"thread_id\": \"...\", \"message\": \"...\", \"type\": \"text|image|audio\" }","operationId":"student_send_message_student_threads_messages_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMessageRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/threads/{thread_id}":{"delete":{"tags":["Student"],"summary":"Delete Student Thread","description":"DELETE /student/threads/{thread_id}\nThe student can delete their own thread if they wish.","operationId":"delete_student_thread_student_threads__thread_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"thread_id","in":"path","required":true,"schema":{"type":"string","title":"Thread Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student/upload-image":{"post":{"tags":["Student"],"summary":"Upload Student Image","description":"Upload an image file to S3 and return its URL.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_student_image_student_upload_image_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__student_chat_routes__ImageUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/upload-audio":{"post":{"tags":["Student"],"summary":"Upload Student Audio","description":"Upload an audio file to S3 and return its URL.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_student_audio_student_upload_audio_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/notes/create":{"post":{"tags":["Notes"],"summary":"Create Note","description":"Create a new note for the user","operationId":"create_note_api_notes_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/notes/list":{"get":{"tags":["Notes"],"summary":"Get Notes","description":"Get all notes for the user, optionally filtered by topic","operationId":"get_notes_api_notes_list_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NoteResponse"},"title":"Response Get Notes Api Notes List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notes/{note_id}":{"delete":{"tags":["Notes"],"summary":"Delete Note","description":"Delete a specific note","operationId":"delete_note_api_notes__note_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Notes"],"summary":"Update Note","description":"Update a specific note","operationId":"update_note_api_notes__note_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/custom-course":{"post":{"tags":["Custom Course"],"summary":"Create Custom Course","operationId":"create_custom_course_custom_course_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomCourseCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__custom_courses__CustomCourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/custom-course/list":{"get":{"tags":["Custom Course"],"summary":"List Custom Courses","operationId":"list_custom_courses_custom_course_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/routers__custom_courses__CustomCourseResponse"},"type":"array","title":"Response List Custom Courses Custom Course List Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/custom-course/{course_id}/content":{"post":{"tags":["Custom Course"],"summary":"Add Course Content","operationId":"add_course_content_custom_course__course_id__content_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseContentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__custom_courses__CustomCourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/custom-course/scan":{"post":{"tags":["Custom Course"],"summary":"Scan Course Content","operationId":"scan_course_content_custom_course_scan_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanLatexRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Scan Course Content Custom Course Scan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/custom-course/{course_id}":{"delete":{"tags":["Custom Course"],"summary":"Delete Course","operationId":"delete_course_custom_course__course_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Custom Course"],"summary":"Get Custom Course","operationId":"get_custom_course_custom_course__course_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__custom_courses__CustomCourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/custom-course/{course_id}/content/{content_index}":{"delete":{"tags":["Custom Course"],"summary":"Remove Course Content","operationId":"remove_course_content_custom_course__course_id__content__content_index__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"content_index","in":"path","required":true,"schema":{"type":"integer","title":"Content Index"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__custom_courses__CustomCourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/custom-course/{course_id}/content/insert":{"post":{"tags":["Custom Course"],"summary":"Insert Course Content","operationId":"insert_course_content_custom_course__course_id__content_insert_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseContentInsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__custom_courses__CustomCourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/custom-course/{course_id}/conversation":{"post":{"tags":["Custom Course"],"summary":"Continue Custom Course Conversation","operationId":"continue_custom_course_conversation_custom_course__course_id__conversation_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__custom_courses__ConversationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__custom_courses__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/custom-course/{course_id}/conversation/stream":{"get":{"tags":["Custom Course"],"summary":"Stream Custom Course Conversation","description":"Streams GPT's reply for a custom course doc.\nUses conversation_service to get last N messages,\nand sse_utils for SSE chunk transformations.","operationId":"stream_custom_course_conversation_custom_course__course_id__conversation_stream_get","parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","description":"JWT Bearer token","title":"Token"},"description":"JWT Bearer token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/custom-course/image":{"post":{"tags":["Custom Course"],"summary":"Upload Course Image","description":"Upload an image for a custom course.\nReturns a JSON response with the image URL.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_course_image_custom_course_image_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__custom_courses__ImageUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/custom-course/{course_id}/audio":{"post":{"tags":["Custom Course"],"summary":"Upload Audio","description":"Upload and transcribe audio for a custom course.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_audio_custom_course__course_id__audio_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/custom-course/{course_id}/chat-history":{"get":{"tags":["Custom Course"],"summary":"Get Custom Course Chat History","description":"Fetch the conversation history for a custom course.","operationId":"get_custom_course_chat_history_custom_course__course_id__chat_history_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__custom_courses__ChatHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/custom-course/{course_id}/conversation/reset":{"post":{"tags":["Custom Course"],"summary":"Reset Conversation","description":"Archive current conversation and start fresh.","operationId":"reset_conversation_custom_course__course_id__conversation_reset_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__custom_courses__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/threads/":{"post":{"tags":["Threads"],"summary":"Create New Thread","description":"Request body might be:\n{\n  \"student_id\": \"...\",\n  \"title\": \"Homework Q&A\"\n}\nCreates a new thread for the logged-in mentor + specified student.","operationId":"create_new_thread_threads__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__threads_routes__CreateThreadRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/threads/{student_id}":{"get":{"tags":["Threads"],"summary":"List Threads For Student","description":"Lists all threads for the (mentor_id, student_id) pair.","operationId":"list_threads_for_student_threads__student_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"student_id","in":"path","required":true,"schema":{"type":"string","title":"Student Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/threads/messages/{thread_id}":{"get":{"tags":["Threads"],"summary":"Get Thread Messages","description":"Fetch messages of the specified thread, verifying mentor ownership.","operationId":"get_thread_messages_threads_messages__thread_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"thread_id","in":"path","required":true,"schema":{"type":"string","title":"Thread Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/threads/messages":{"post":{"tags":["Threads"],"summary":"Send Message To Thread","description":"Example body:\n{\n  \"thread_id\": \"...\",\n  \"message\": \"Hello, student!\",\n  \"type\": \"text\"\n}","operationId":"send_message_to_thread_threads_messages_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMessageRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/threads/{thread_id}":{"delete":{"tags":["Threads"],"summary":"Delete Thread","description":"Delete a thread and all its messages","operationId":"delete_thread_threads__thread_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"thread_id","in":"path","required":true,"schema":{"type":"string","title":"Thread Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/threads/upload-image":{"post":{"tags":["Threads"],"summary":"Upload Student Image","description":"Upload an image file to S3 and return its URL.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_student_image_threads_upload_image_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__threads_routes__ImageUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/threads/upload-audio":{"post":{"tags":["Threads"],"summary":"Upload Student Audio","description":"Upload an audio file to S3 and return its URL.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_student_audio_threads_upload_audio_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/homework-helper/scan-exercise":{"post":{"tags":["Homework Helper"],"summary":"Scan Exercise","description":"Scan an image and return the transcription.\n\nNote: Transcription logging happens via /log-transcription endpoint,\ncalled from the frontend when accepting in the preview modal.","operationId":"scan_exercise_homework_helper_scan_exercise_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__homework_helper_routes__ScanExerciseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__homework_helper_routes__ScanExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/homework-helper/log-transcription":{"post":{"tags":["Homework Helper"],"summary":"Log Transcription","description":"Log a homework helper transcription with optional figure_id.\n\nCalled from the frontend when accepting a transcription in the preview modal,\nbefore the exercise is officially created.","operationId":"log_transcription_homework_helper_log_transcription_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogTranscriptionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Log Transcription Homework Helper Log Transcription Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/homework-helper/preview-text":{"post":{"tags":["Homework Helper"],"summary":"Preview Text Exercise","operationId":"preview_text_exercise_homework_helper_preview_text_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextExerciseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__homework_helper_routes__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/homework-helper/create-text-exercise":{"post":{"tags":["Homework Helper"],"summary":"Create Text Exercise","operationId":"create_text_exercise_homework_helper_create_text_exercise_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTextExerciseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__homework_helper_routes__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/homework-helper/exercises":{"get":{"tags":["Homework Helper"],"summary":"List Homework Exercises","operationId":"list_homework_exercises_homework_helper_exercises_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"enum":["maths","physique-chimie"],"type":"string"},{"type":"null"}],"title":"Subject"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HomeworkHelperSummary"},"title":"Response List Homework Exercises Homework Helper Exercises Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/homework-helper/{teacher_exercise_id}/title":{"put":{"tags":["Homework Helper"],"summary":"Update Homework Title Route","operationId":"update_homework_title_route_homework_helper__teacher_exercise_id__title_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"teacher_exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Teacher Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTitleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HomeworkHelperSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mentor/exercises":{"get":{"tags":["Mentor Exercises"],"summary":"Get Exercises","operationId":"get_exercises_mentor_exercises_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Mentor Exercises"],"summary":"Create Exercise","operationId":"create_exercise_mentor_exercises_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExerciseCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/mentor/exercises/{exercise_id}":{"get":{"tags":["Mentor Exercises"],"summary":"Get Exercise","operationId":"get_exercise_mentor_exercises__exercise_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Mentor Exercises"],"summary":"Update Exercise","operationId":"update_exercise_mentor_exercises__exercise_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExerciseUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Mentor Exercises"],"summary":"Delete Exercise","operationId":"delete_exercise_mentor_exercises__exercise_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/image/fetch":{"post":{"tags":["image"],"summary":"Fetch Image","description":"Existing route that fetches a remote image\nand returns it as a response.","operationId":"fetch_image_image_fetch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageUrlRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/image/upload":{"post":{"tags":["image"],"summary":"Upload Image","description":"Accepts a base64-encoded image in JSON format,\nuploads it to S3, and returns its public URL.\nUses pattern: \"user_uploads/images/{uuid}.{ext}\"\n\nWorks for both web and mobile platforms.","operationId":"upload_image_image_upload_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Base64ImageUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/image/process":{"post":{"tags":["image"],"summary":"Process Images","description":"Accepts JSON with:\n   {\n     \"image_urls\": [\"...\", \"...\", ...],\n     \"previous_transcription\": \"...\",   (optional)\n     \"description\": \"...\"              (optional)\n     \"country\": \"US\"                  (optional)\n   }\n\nSends all image URLs to GPT in one API call and returns the combined transcription.\nFor transcription history, only the first image URL is used.","operationId":"process_images_image_process_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessImagesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessImagesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/image/upload-pdf":{"post":{"tags":["image"],"summary":"Upload Pdf","description":"Accepts a base64-encoded PDF in JSON format,\nconverts its pages to JPEG images (limited to the first 20 pages if longer),\nuploads each page to S3,\nand returns a list of public image URLs.\n\nWorks for both web and mobile platforms.","operationId":"upload_pdf_image_upload_pdf_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Base64PDFUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PDFUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/image/upload-word":{"post":{"tags":["image"],"summary":"Upload Word","description":"Accepts a base64-encoded Word (.docx) file,\nconverts it to PDF via pandoc, then to JPEG images,\nuploads each page to S3, and returns image URLs.","operationId":"upload_word_image_upload_word_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Base64WordUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PDFUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/image/refine":{"post":{"tags":["image"],"summary":"Refine Image Transcription","description":"Refines an existing transcription by focusing on a faulty line + user feedback.\n    Does NOT require image URLs; it just updates the text with LLM logic.\n\n    Example input:\n        {\n          \"old_transcription\": \"Line1\nLine2\nLine3\",\n          \"faulty_line\": \"Line2\",\n          \"user_feedback\": \"Spelling is wrong\",\n          \"lang\": \"en\",\n          \"url\": \"https://example.com/image.jpg\"\n        }","operationId":"refine_image_transcription_image_refine_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefineTranscriptionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefineTranscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/image/detect-diagram":{"post":{"tags":["image"],"summary":"Detect Diagrams","description":"Accepts a list of image URLs and returns only those that contain diagrams.\n\nExample input:\n    {\n      \"image_urls\": [\"https://example.com/image1.jpg\", \"https://example.com/image2.jpg\"]\n    }\n\nReturns:\n    {\n      \"status\": \"success\",\n      \"message\": \"Diagrams detected successfully\",\n      \"diagram_image_urls\": [\"https://example.com/image1.jpg\"]\n    }","operationId":"detect_diagrams_image_detect_diagram_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetectDiagramRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetectDiagramResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/image/generate-diagram-preview":{"post":{"tags":["image"],"summary":"Generate Diagram Preview","description":"Generate clean diagram previews for provided diagrams.\n\nThis endpoint is designed for ephemeral UI flows such as the\ntranscription preview modal and teacher exam diagram generation. It accepts\neither diagram image URLs or a figure description (or both), calls\ngenerate_diagram, and returns the rendered image alongside the generated\nmatplotlib code.","operationId":"generate_diagram_preview_image_generate_diagram_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateDiagramPreviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateDiagramPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/image/detect-handwriting":{"post":{"tags":["image"],"summary":"Detect Handwriting Route","description":"Accepts a list of image URLs and returns whether each image contains handwriting.\nUses acompletion with prompt_id=\"detect_handwriting\" to analyze each image in parallel.\nThe LLM returns either \"handwriting\" or \"print\" for each image.\n\nExample input:\n    {\n      \"image_urls\": [\"https://example.com/image1.jpg\", \"https://example.com/image2.jpg\"]\n    }\n\nReturns:\n    {\n      \"status\": \"success\",\n      \"message\": \"Handwriting detection completed\",\n      \"handwriting_results\": [\n        {\"url\": \"https://example.com/image1.jpg\", \"is_handwritten\": true},\n        {\"url\": \"https://example.com/image2.jpg\", \"is_handwritten\": false}\n      ]\n    }","operationId":"detect_handwriting_route_image_detect_handwriting_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetectHandwritingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetectHandwritingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/figures/":{"post":{"tags":["Figures"],"summary":"Create Figure","description":"Create a new figure and start async generation.","operationId":"create_figure_figures__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFigureRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFigureResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/figures/{figure_id}":{"get":{"tags":["Figures"],"summary":"Get Figure","description":"Get figure status and content.","operationId":"get_figure_figures__figure_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"figure_id","in":"path","required":true,"schema":{"type":"string","title":"Figure Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__figures__FigureResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/figures/{figure_id}/reprompt":{"post":{"tags":["Figures"],"summary":"Reprompt Figure","description":"Reprompt an existing figure to create a new version.","operationId":"reprompt_figure_figures__figure_id__reprompt_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"figure_id","in":"path","required":true,"schema":{"type":"string","title":"Figure Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepromptFigureRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFigureResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/figures/{figure_id}/retry":{"post":{"tags":["Figures"],"summary":"Retry Figure","description":"Retry generating a failed figure using its existing metadata.","operationId":"retry_figure_figures__figure_id__retry_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"figure_id","in":"path","required":true,"schema":{"type":"string","title":"Figure Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFigureResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/google/login":{"get":{"tags":["OAuth - Google"],"summary":"Google Oauth Login","description":"Redirects the user to Google's OAuth 2.0 consent screen.","operationId":"google_oauth_login_google_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/google/callback":{"get":{"tags":["OAuth - Google"],"summary":"Google Oauth Callback","description":"Handles the callback from Google, exchanging the authorization code for tokens,\nthen validates the ID token with Google's public keys, and logs the user in.","operationId":"google_oauth_callback_google_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/google/native-login":{"post":{"tags":["OAuth - Google"],"summary":"Google Native Login","operationId":"google_native_login_google_native_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleNativeLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleNativeLoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apple/callback":{"post":{"tags":["OAuth - Apple"],"summary":"Apple Oauth Callback","description":"Handles the callback from Apple Sign In, validates the token,\nand creates or updates the user account.","operationId":"apple_oauth_callback_apple_callback_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/onboarding/country":{"post":{"tags":["Onboarding"],"summary":"Update Country","description":"First step of onboarding: update the user's country and full name.","operationId":"update_country_onboarding_country_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/onboarding/grade":{"post":{"tags":["Onboarding"],"summary":"Update Grade","description":"Second step of onboarding: update the user's grade.\nThe user will be marked as onboarded after completing the billing step.","operationId":"update_grade_onboarding_grade_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GradeInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/onboarding/complete-final":{"post":{"tags":["Onboarding"],"summary":"Finalize User Onboarding","description":"[DEPRECATED for main onboarding flow]\nThis endpoint is no longer needed for the main onboarding flow as is_onboarded is set during registration.\nIt's kept for backward compatibility and potential use in other flows.\n\nFinalize the onboarding process by marking the user as fully onboarded.\nThis should be called after all onboarding steps are completed.","operationId":"finalize_user_onboarding_onboarding_complete_final_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/onboarding/submit-context-data":{"post":{"tags":["Onboarding"],"summary":"Submit Onboarding Context For User","description":"This endpoint is crucial for users who sign up/log in via Google (or any OAuth)\nafter going through guest onboarding. It allows updating user profile with\nonboarding data collected before authentication.","operationId":"submit_onboarding_context_for_user_onboarding_submit_context_data_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmittedOnboardingContextData"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/onboarding/link-class":{"post":{"tags":["Onboarding"],"summary":"Link Student To Class","description":"Link a student to a class using a class code provided by the teacher.\nThis feature is intended for French middle and high school students.","operationId":"link_student_to_class_onboarding_link_class_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassCodeLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Link Student To Class Onboarding Link Class Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/onboarding/me/onboarding":{"patch":{"tags":["Onboarding"],"summary":"Update User Onboarding","description":"Progressive onboarding endpoint - updates user data step by step.\nThis endpoint is called after each onboarding screen to save progress.","operationId":"update_user_onboarding_onboarding_me_onboarding_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingStepData"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/onboarding/me/establishment":{"patch":{"tags":["Onboarding"],"summary":"Update Teacher Establishment","description":"Set an already-onboarded teacher's establishment (teachers who signed up\nbefore the onboarding step existed). Writes the same fields as the\nonboarding step but never touches `onboarding_step`.","operationId":"update_teacher_establishment_onboarding_me_establishment_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherEstablishmentUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherEstablishmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/onboarding/me/establishment/snooze":{"patch":{"tags":["Onboarding"],"summary":"Snooze Teacher Establishment Prompt","description":"Push the \"Où enseignez-vous ?\" prompt back by a week.","operationId":"snooze_teacher_establishment_prompt_onboarding_me_establishment_snooze_patch","responses":{"204":{"description":"Successful Response"}},"security":[{"OAuth2PasswordBearer":[]}]}},"/onboarding/track-event":{"post":{"tags":["Onboarding"],"summary":"Track Onboarding Event","description":"Track a specific onboarding funnel event for an authenticated user.\nExample steps: first_student_home, teacher_pending_approval_viewed.","operationId":"track_onboarding_event_onboarding_track_event_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackOnboardingEvent"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher-verification/status":{"get":{"tags":["Teacher Verification"],"summary":"Get Verification Status","description":"Current teacher-verification state, used by the onboarding step to\ndecide between \"verify your account email\" and \"enter your academic\naddress\".","operationId":"get_verification_status_teacher_verification_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherVerificationStatus"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher-verification/request":{"post":{"tags":["Teacher Verification"],"summary":"Request Verification","description":"Send a verification magic link to the teacher's academic address.","operationId":"request_verification_teacher_verification_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestVerificationData"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher-verification/confirm":{"post":{"tags":["Teacher Verification"],"summary":"Confirm Verification","description":"Confirm a teacher-verification magic link.\n\nPublic endpoint: the teacher may open the link from any device, logged in\nor not — the token is self-contained. A successful confirmation proves\nownership of an academic address, so the account is auto-approved.","operationId":"confirm_verification_teacher_verification_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmVerificationData"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-verification/no-academic-email":{"post":{"tags":["Teacher Verification"],"summary":"Report No Academic Email","description":"The teacher has no academic address: store their explanation and alert\nthe team so the account can be validated manually.","operationId":"report_no_academic_email_teacher_verification_no_academic_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoAcademicEmailData"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/public-exercises/counts-by-category-path":{"get":{"tags":["public_exercises"],"summary":"Get Exercise Counts By Category Path","description":"Return `{ \"Grade / Chapter / Thematic\": count }` for every distinct\n`category_path` in the library (Legacy included). The key format is\n`segments.join(\" / \")` so the caller can build both chapter-level and\nthematic-level badges in one round-trip:\n\n  counts[\"Terminale / Probabilités\"]              // chapter-level\n  counts[\"Terminale / Probabilités / Loi binomiale\"] // thematic-level\n\nChapter-level counts are rolled up by the caller from the thematic\nentries (or read directly when an exercise is stored at chapter depth).","operationId":"get_exercise_counts_by_category_path_public_exercises_counts_by_category_path_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"enum":["maths","physique-chimie"],"type":"string"},{"type":"null"}],"description":"Scope counts to a matière (see list endpoint).","title":"Subject"},"description":"Scope counts to a matière (see list endpoint)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"integer"},"title":"Response Get Exercise Counts By Category Path Public Exercises Counts By Category Path Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public-exercises":{"get":{"tags":["public_exercises"],"summary":"List Public Exercises","description":"Retrieve public exercises from the DB with optional filtering.\nEveryone with a valid token can see them.\n\n- year: Optional year to filter by (e.g. premiere_fr)\n- chapter: Optional chapter to filter by (e.g. derivation_chapitre)\n- themes: Optional list of theme IDs to filter by (OR condition)\n- difficulty: Optional difficulty tag ID to filter by (AND condition)\n- chapter_tags: Optional list of chapter-specific tag IDs (AND condition)\n- sequence_number: Optional sequence number to filter by\n- smart: If True, use smart selection algorithm to select exercises\n- count: Number of exercises to return when using smart selection","operationId":"list_public_exercises_public_exercises_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by year (e.g. premiere_fr)","title":"Year"},"description":"Filter by year (e.g. premiere_fr)"},{"name":"chapter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by chapter (e.g. derivation_chapitre)","title":"Chapter"},"description":"Filter by chapter (e.g. derivation_chapitre)"},{"name":"themes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by theme IDs","title":"Themes"},"description":"Filter by theme IDs"},{"name":"difficulty","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by difficulty tag ID","title":"Difficulty"},"description":"Filter by difficulty tag ID"},{"name":"chapter_tags","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by chapter-specific tags (AND condition)","title":"Chapter Tags"},"description":"Filter by chapter-specific tags (AND condition)"},{"name":"category_path","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by category_path prefix. Repeat the query param for each segment, e.g. ?category_path=Terminale&category_path=Probabilités. When provided, skips the legacy themes/chapter_tags filters.","title":"Category Path"},"description":"Filter by category_path prefix. Repeat the query param for each segment, e.g. ?category_path=Terminale&category_path=Probabilités. When provided, skips the legacy themes/chapter_tags filters."},{"name":"sequence_number","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by exercise sequence number","title":"Sequence Number"},"description":"Filter by exercise sequence number"},{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"enum":["maths","physique-chimie"],"type":"string"},{"type":"null"}],"description":"Filter by matière. Defaults to the teacher's own subject; students pass their currently-selected subject. Admins see all when omitted.","title":"Subject"},"description":"Filter by matière. Defaults to the teacher's own subject; students pass their currently-selected subject. Admins see all when omitted."},{"name":"smart","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Use smart selection algorithm to select exercises","default":false,"title":"Smart"},"description":"Use smart selection algorithm to select exercises"},{"name":"count","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of exercises to return when using smart selection","default":3,"title":"Count"},"description":"Number of exercises to return when using smart selection"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicExerciseOut"},"title":"Response List Public Exercises Public Exercises Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["public_exercises"],"summary":"Create Public Exercise","description":"Create a new public exercise, with multiple themes (tags) and content/solution.\nAutomatically assigns a sequence number by finding the highest existing one and incrementing it.","operationId":"create_public_exercise_public_exercises_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExerciseCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExerciseOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public-exercises/categories":{"get":{"tags":["public_exercises"],"summary":"Get Teacher Categories","description":"Return the `category_path` tree with cumulative counts.","operationId":"get_teacher_categories_public_exercises_categories_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"include_legacy","in":"query","required":false,"schema":{"type":"boolean","description":"Include the 'Legacy' bucket (uncategorized exercises).","default":false,"title":"Include Legacy"},"description":"Include the 'Legacy' bucket (uncategorized exercises)."},{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"enum":["maths","physique-chimie"],"type":"string"},{"type":"null"}],"description":"Scope the tree to a matière (see list endpoint).","title":"Subject"},"description":"Scope the tree to a matière (see list endpoint)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherCategoryNode"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public-exercises/search":{"get":{"tags":["public_exercises"],"summary":"Search Public Exercises","description":"Hybrid vector + keyword search over `public_exercises`.\n\nThe search core (embed → vector KNN → keyword regex → RRF merge → hydrate\n+ gate) lives in `services/exercise_library_search.py`, shared with the\nchat tool `search_exercise_library`.\n\nThe response shape mirrors `GET /public-exercises` so callers can reuse the\nexisting `PublicExerciseOut` type.","operationId":"search_public_exercises_public_exercises_search_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Free-text search query.","title":"Q"},"description":"Free-text search query."},{"name":"category_path","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Prefix filter on category_path (repeat the query param per segment). Results are post-filtered to rows whose category_path starts with these segments.","title":"Category Path"},"description":"Prefix filter on category_path (repeat the query param per segment). Results are post-filtered to rows whose category_path starts with these segments."},{"name":"difficulty","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact-match filter on difficulty (easy/medium/hard).","title":"Difficulty"},"description":"Exact-match filter on difficulty (easy/medium/hard)."},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"enum":["exercice","automatisme","application_du_cours"],"type":"string"},{"type":"null"}],"description":"Exact-match filter on type.","title":"Type"},"description":"Exact-match filter on type."},{"name":"library","in":"query","required":false,"schema":{"anyOf":[{"enum":["excellence","cpge","remediation"],"type":"string"},{"type":"null"}],"description":"Admin-only library override. Non-admin callers stay gated by `library_filter_for(user)` regardless of this param.","title":"Library"},"description":"Admin-only library override. Non-admin callers stay gated by `library_filter_for(user)` regardless of this param."},{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"enum":["maths","physique-chimie"],"type":"string"},{"type":"null"}],"description":"Scope search to a matière (see list endpoint).","title":"Subject"},"description":"Scope search to a matière (see list endpoint)."},{"name":"top_n","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max number of results.","default":30,"title":"Top N"},"description":"Max number of results."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicExerciseOut"},"title":"Response Search Public Exercises Public Exercises Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public-exercises/{exercise_id}":{"get":{"tags":["public_exercises"],"summary":"Get Public Exercise","operationId":"get_public_exercise_public_exercises__exercise_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExerciseOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["public_exercises"],"summary":"Update Public Exercise","operationId":"update_public_exercise_public_exercises__exercise_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExerciseUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExerciseOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["public_exercises"],"summary":"Delete Public Exercise","operationId":"delete_public_exercise_public_exercises__exercise_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public-exercises/{exercise_id}/reformat":{"post":{"tags":["public_exercises"],"summary":"Reformat Exercise Field","description":"Reformat the content or solution of an exercise using LLM.\nOnly admins can use this feature.","operationId":"reformat_exercise_field_public_exercises__exercise_id__reformat_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__public_exercises__ReformatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReformatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public-exercises/batch-reformat":{"post":{"tags":["public_exercises"],"summary":"Batch Reformat Exercises","description":"Reformat multiple exercises at once using LLM.\nOnly admins can use this feature.","operationId":"batch_reformat_exercises_public_exercises_batch_reformat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__public_exercises__BatchReformatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__public_exercises__BatchReformatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/public-exercises/{exercise_id}/flag":{"post":{"tags":["public_exercises"],"summary":"Flag Public Exercise","description":"Flag a public exercise for review due to issues.\nAny authenticated user can flag an exercise.","operationId":"flag_public_exercise_public_exercises__exercise_id__flag_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExerciseFlagCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExerciseFlagOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/validate-class-code":{"post":{"tags":["public"],"summary":"Validate Class Code","description":"Validate a class code without requiring authentication.\nReturns details about the class if valid.\nSupports both regular class codes and single-use codes.","operationId":"validate_class_code_public_validate_class_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateClassCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateClassCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cpge-exercises":{"get":{"tags":["cpge_exercises"],"summary":"List Cpge Exercises","description":"Retrieve CPGE exercises from `public_exercises` (library='cpge').\n\nPreserves the legacy API shape: the storage is unified since migration\n013, but the router still returns CPGEExerciseOut and accepts the old\nfiliere/banque/type_exercice triplet.\n\n- filiere: Optional filiere to filter by (e.g. MP, PSI, PC)\n- banque: Optional banque to filter by (e.g. X, ENS, Centrale, Mines Pont, CCINP)\n- type_exercice: Optional chapter slug to filter by\n- random_selection: If True, returns a single random exercise from the filtered results","operationId":"list_cpge_exercises_cpge_exercises_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"filiere","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by filiere (e.g. MP)","title":"Filiere"},"description":"Filter by filiere (e.g. MP)"},{"name":"banque","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by banque (e.g. X)","title":"Banque"},"description":"Filter by banque (e.g. X)"},{"name":"type_exercice","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by type (e.g. Algèbre)","title":"Type Exercice"},"description":"Filter by type (e.g. Algèbre)"},{"name":"random_selection","in":"query","required":false,"schema":{"type":"boolean","description":"Select one random exercise from matches","default":false,"title":"Random Selection"},"description":"Select one random exercise from matches"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CPGEExerciseOut"},"title":"Response List Cpge Exercises Cpge Exercises Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["cpge_exercises"],"summary":"Create Cpge Exercise","description":"Create a new CPGE exercise in `public_exercises` (library='cpge').\nOnly admins can create exercises.","operationId":"create_cpge_exercise_cpge_exercises_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CPGEExerciseCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CPGEExerciseOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cpge-exercises/chat-message-counts":{"get":{"tags":["cpge_exercises"],"summary":"Get Chat Message Counts","operationId":"get_chat_message_counts_cpge_exercises_chat_message_counts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatMessageCountResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/cpge-exercises/user-history":{"get":{"tags":["cpge_exercises"],"summary":"Get User Exercise History","description":"Get the user's CPGE exercise history.\nThis includes all exercises the user has viewed, along with self-ratings and notes.","operationId":"get_user_exercise_history_cpge_exercises_user_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Get User Exercise History Cpge Exercises User History Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/cpge-exercises/{exercise_id}":{"get":{"tags":["cpge_exercises"],"summary":"Get Cpge Exercise","operationId":"get_cpge_exercise_cpge_exercises__exercise_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CPGEExerciseOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["cpge_exercises"],"summary":"Update Cpge Exercise","operationId":"update_cpge_exercise_cpge_exercises__exercise_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CPGEExerciseUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CPGEExerciseOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["cpge_exercises"],"summary":"Delete Cpge Exercise","operationId":"delete_cpge_exercise_cpge_exercises__exercise_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cpge-exercises/{exercise_id}/solution-attempt":{"post":{"tags":["cpge_exercises"],"summary":"Submit Cpge Solution Attempt","description":"Submit a solution attempt for a CPGE exercise and get feedback.","operationId":"submit_cpge_solution_attempt_cpge_exercises__exercise_id__solution_attempt_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CPGESolutionAttempt"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CPGESolutionCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cpge-exercises/{exercise_id}/track-view":{"post":{"tags":["cpge_exercises"],"summary":"Track Exercise View","description":"Track when a user views a CPGE exercise.\nThis will create a new record if it's the first view,\nor update the last_seen_at timestamp if the user has viewed it before.","operationId":"track_exercise_view_cpge_exercises__exercise_id__track_view_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__cpge_exercises__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cpge-exercises/{exercise_id}/user-data":{"put":{"tags":["cpge_exercises"],"summary":"Update User Exercise Data","description":"Update user's self-rating, notes, and review flag for a CPGE exercise.","operationId":"update_user_exercise_data_cpge_exercises__exercise_id__user_data_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCPGEExerciseUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__cpge_exercises__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cpge-exercises/{exercise_id}/user-history":{"delete":{"tags":["cpge_exercises"],"summary":"Delete User Exercise History","description":"Delete a specific exercise from the user's history.\nThis removes all tracking data for this exercise for the current user.","operationId":"delete_user_exercise_history_cpge_exercises__exercise_id__user_history_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__cpge_exercises__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cpge-exercises/report":{"post":{"tags":["cpge_exercises"],"summary":"Report Exercise","description":"Submit a report for an exercise (bad formatting, wrong solution, etc.)","operationId":"report_exercise_cpge_exercises_report_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExerciseReportCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__cpge_exercises__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/cpge-exercises/{exercise_id}/reformat":{"post":{"tags":["cpge_exercises"],"summary":"Reformat Exercise Field","description":"Reformat the content or solution of a CPGE exercise using LLM.\nOnly admins can use this feature.","operationId":"reformat_exercise_field_cpge_exercises__exercise_id__reformat_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__cpge_exercises__ReformatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReformatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cpge-exercises/batch-reformat":{"post":{"tags":["cpge_exercises"],"summary":"Batch Reformat Exercises","description":"Reformat multiple CPGE exercises at once using LLM.\nOnly admins can use this feature.","operationId":"batch_reformat_exercises_cpge_exercises_batch_reformat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__cpge_exercises__BatchReformatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__cpge_exercises__BatchReformatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/cpge-exercises/{exercise_id}/reformat-hints":{"post":{"tags":["cpge_exercises"],"summary":"Reformat Exercise Hints","description":"Reformat all three hints of a CPGE exercise using LLM.\nOnly admins can use this feature.","operationId":"reformat_exercise_hints_cpge_exercises__exercise_id__reformat_hints_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reformat Exercise Hints Cpge Exercises  Exercise Id  Reformat Hints Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cpge-exercises/batch-reformat-hints":{"post":{"tags":["cpge_exercises"],"summary":"Batch Reformat Exercise Hints","description":"Reformat hints for multiple CPGE exercises at once using LLM.\nOnly admins can use this feature.","operationId":"batch_reformat_exercise_hints_cpge_exercises_batch_reformat_hints_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__cpge_exercises__BatchReformatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Batch Reformat Exercise Hints Cpge Exercises Batch Reformat Hints Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/exercise-practice/{topicName}/exercises":{"get":{"tags":["exercise_practice"],"summary":"Get Exercises For Topic","description":"Returns public exercises whose `category_path` contains `topicName` as\none of its segments (grade / chapter / thematic — any level).\n\nReplaces the legacy tag-id lookup now that `public_exercises` classifies\nvia `category_path` (migration 004) instead of the `themes`+`tags` model.","operationId":"get_exercises_for_topic_exercise_practice__topicName__exercises_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"topicName","in":"path","required":true,"schema":{"type":"string","title":"Topicname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-practice/{exercise_id}/chat":{"post":{"tags":["exercise_practice"],"summary":"Send Practice Message","description":"Appends a user message to conversation_history for (user, exercise_id).","operationId":"send_practice_message_exercise_practice__exercise_id__chat_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_practice__ChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_practice__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-practice/{exercise_id}/chat/stream":{"get":{"tags":["exercise_practice"],"summary":"Stream Practice Chat Response","description":"Streams the tutor's reply for the given exercise_id,\nbuilding a system prompt from the exercise,\ncontinuing from the last ~10 messages in the practice_sessions doc.","operationId":"stream_practice_chat_response_exercise_practice__exercise_id__chat_stream_get","parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-practice/{exercise_id}/audio":{"post":{"tags":["exercise_practice"],"summary":"Upload Audio For Exercise","description":"Upload & transcribe audio => store transcript in conversation_history.","operationId":"upload_audio_for_exercise_exercise_practice__exercise_id__audio_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_practice__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-practice/{exercise_id}/chat-history":{"get":{"tags":["exercise_practice"],"summary":"Get Exercise Chat History","description":"Fetch the conversation history for an exercise practice.","operationId":"get_exercise_chat_history_exercise_practice__exercise_id__chat_history_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_practice__ChatHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-practice/{exercise_id}/conversation/reset":{"post":{"tags":["exercise_practice"],"summary":"Reset Conversation","description":"Archive current conversation and start fresh.","operationId":"reset_conversation_exercise_practice__exercise_id__conversation_reset_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_practice__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/all":{"get":{"tags":["exercise_sessions"],"summary":"Get All Exercise Sessions","description":"Returns all exercise sessions for the current user with basic information.\nOnly includes self-created sessions (excluding assignments).\nAlso includes tag information for the exercises to display chapter names.\nUses MongoDB aggregation pipeline for improved performance.","operationId":"get_all_exercise_sessions_exercise_sessions_all_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":100,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions":{"post":{"tags":["exercise_sessions"],"summary":"Create Exercise Session","description":"Creates a new exercise session doc with the chosen exercises, sequential/parallel, etc.\nReturns session_id in the 'message' field of BasicResponse.","operationId":"create_exercise_session_exercise_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExerciseSessionCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_sessions__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/exercise-sessions/{session_id}":{"get":{"tags":["exercise_sessions"],"summary":"Get Exercise Session","description":"Get details about an existing exercise session, including exercises.","operationId":"get_exercise_session_exercise_sessions__session_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_sessions__SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/solution":{"post":{"tags":["exercise_sessions"],"summary":"Submit Solution","description":"Process the submitted LaTeX solution and check for correctness.","operationId":"submit_solution_exercise_sessions__session_id__exercises__exercise_id__solution_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExerciseSolutionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/generate-remediation":{"post":{"tags":["exercise_sessions"],"summary":"Generate Remediation Session","description":"Generate a personalized remediation session based on student performance.\nCreates 3 AI-generated exercises targeting weak areas, inserts them as public\nexercises, and creates a new exercise session linked to the original.","operationId":"generate_remediation_session_exercise_sessions__session_id__generate_remediation_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/summary/details":{"get":{"tags":["exercise_sessions"],"summary":"Get Session Summary Details","description":"Retrieve the per-exercise details used by the summary view without triggering LLM generation.","operationId":"get_session_summary_details_exercise_sessions__session_id__summary_details_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/summary":{"get":{"tags":["exercise_sessions"],"summary":"Get Session Summary","description":"Get or generate a summary for the session.\nIf the session is linked to a study plan unit, mark the unit as completed.","operationId":"get_session_summary_exercise_sessions__session_id__summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"force_regenerate","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force Regenerate"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/blocks/add-images":{"post":{"tags":["exercise_sessions"],"summary":"Add Image Blocks","description":"Add images as blocks with parallel processing and assignment validation:\nFor assignments:\n1. Compute hashes for plagiarism detection\n2. Check for plagiarism against other students\n3. Detect handwriting (must be handwritten)\n4. Detect diagrams and transcribe in parallel\nFor all sessions:\n5. Create blocks and log transcription history","operationId":"add_image_blocks_exercise_sessions__session_id__exercises__exercise_id__blocks_add_images_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddImagesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SolutionBlockResponse"},"title":"Response Add Image Blocks Exercise Sessions  Session Id  Exercises  Exercise Id  Blocks Add Images Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/blocks/add-diagrams":{"post":{"tags":["exercise_sessions"],"summary":"Add Diagram Blocks","description":"Add diagram-only blocks (no transcription)\nUsed for \"Ajouter schéma\" button","operationId":"add_diagram_blocks_exercise_sessions__session_id__exercises__exercise_id__blocks_add_diagrams_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddImagesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SolutionBlockResponse"},"title":"Response Add Diagram Blocks Exercise Sessions  Session Id  Exercises  Exercise Id  Blocks Add Diagrams Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/blocks/add-text":{"post":{"tags":["exercise_sessions"],"summary":"Add Text Block","description":"Add a text-only block (no images, just user-entered text)","operationId":"add_text_block_exercise_sessions__session_id__exercises__exercise_id__blocks_add_text_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTextRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionBlockResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/blocks/tableau":{"post":{"tags":["exercise_sessions"],"summary":"Create Tableau Block","operationId":"create_tableau_block_exercise_sessions__session_id__exercises__exercise_id__blocks_tableau_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableauPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionBlockResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/blocks/{block_id}/generate-diagram":{"post":{"tags":["exercise_sessions"],"summary":"Generate Block Diagram","description":"Start async generation of a clean diagram image for a block.\n\nCreates a Figure and stores its ID in the block. The Figure component\non the frontend will poll for completion.","operationId":"generate_block_diagram_exercise_sessions__session_id__exercises__exercise_id__blocks__block_id__generate_diagram_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateDiagramRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionBlockResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/blocks/{block_id}/generated-diagram":{"delete":{"tags":["exercise_sessions"],"summary":"Delete Generated Block Diagram","description":"Remove any generated figure from an image block.\n\nThis clears figure_id for the block and restores the\noriginal diagram selection based on the primary image URL.","operationId":"delete_generated_block_diagram_exercise_sessions__session_id__exercises__exercise_id__blocks__block_id__generated_diagram_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionBlockResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/blocks/{block_id}/figure":{"patch":{"tags":["exercise_sessions"],"summary":"Update Block Figure Id","description":"Update the figure_id of a solution block.\n\nThis is used when reprompting a figure to update the block\nwith the new figure's ID.","operationId":"update_block_figure_id_exercise_sessions__session_id__exercises__exercise_id__blocks__block_id__figure_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBlockFigureIdRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionBlockResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/blocks/{block_id}":{"get":{"tags":["exercise_sessions"],"summary":"Get Solution Block","operationId":"get_solution_block_exercise_sessions__session_id__exercises__exercise_id__blocks__block_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionBlockResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["exercise_sessions"],"summary":"Delete Block","description":"Remove a block and update positions","operationId":"delete_block_exercise_sessions__session_id__exercises__exercise_id__blocks__block_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/blocks/{block_id}/tableau":{"put":{"tags":["exercise_sessions"],"summary":"Replace Tableau Block","operationId":"replace_tableau_block_exercise_sessions__session_id__exercises__exercise_id__blocks__block_id__tableau_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-Match"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TableauPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionBlockResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["exercise_sessions"],"summary":"Patch Tableau Block","operationId":"patch_tableau_block_exercise_sessions__session_id__exercises__exercise_id__blocks__block_id__tableau_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}},{"name":"If-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-Match"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionBlockResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/blocks/{block_id}/toggle-diagram":{"put":{"tags":["exercise_sessions"],"summary":"Toggle Diagram Status","description":"Toggle diagram status for an image in a block","operationId":"toggle_diagram_status_exercise_sessions__session_id__exercises__exercise_id__blocks__block_id__toggle_diagram_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToggleDiagramRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionBlockResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/blocks/{block_id}/ai-edit":{"post":{"tags":["exercise_sessions"],"summary":"Ai Edit Block","description":"AI improve specific block's text","operationId":"ai_edit_block_exercise_sessions__session_id__exercises__exercise_id__blocks__block_id__ai_edit_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionBlockResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/blocks/{block_id}/fix-transcription":{"post":{"tags":["exercise_sessions"],"summary":"Fix Transcription Block","description":"Detect and propose fixes for transcription mistakes.","operationId":"fix_transcription_block_exercise_sessions__session_id__exercises__exercise_id__blocks__block_id__fix_transcription_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FixTranscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/blocks/{block_id}/edit-text":{"put":{"tags":["exercise_sessions"],"summary":"Edit Text Block","description":"Edit the text content of a text-only block","operationId":"edit_text_block_exercise_sessions__session_id__exercises__exercise_id__blocks__block_id__edit_text_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"block_id","in":"path","required":true,"schema":{"type":"string","title":"Block Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditTextRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionBlockResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/blocks/reorder":{"put":{"tags":["exercise_sessions"],"summary":"Reorder Blocks","description":"Reorder blocks by updating positions","operationId":"reorder_blocks_exercise_sessions__session_id__exercises__exercise_id__blocks_reorder_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/edit-latex":{"post":{"tags":["exercise_sessions"],"summary":"Edit Exercise Latex","description":"Directly update LaTeX content without LLM processing","operationId":"edit_exercise_latex_exercise_sessions__session_id__exercises__exercise_id__edit_latex_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditLatexRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/edit-ai":{"post":{"tags":["exercise_sessions"],"summary":"Edit Exercise Ai","description":"Improve solution content using AI with user prompt","operationId":"edit_exercise_ai_exercise_sessions__session_id__exercises__exercise_id__edit_ai_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditAiRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/transcribe-text":{"post":{"tags":["exercise_sessions"],"summary":"Transcribe Exercise Text","description":"Process plain text and store LaTeX transcription","operationId":"transcribe_exercise_text_exercise_sessions__session_id__exercises__exercise_id__transcribe_text_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscribeTextRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/save-diagram-urls":{"post":{"tags":["exercise_sessions"],"summary":"Save Diagram Urls","description":"Save diagram image URLs for an exercise (appends to existing)","operationId":"save_diagram_urls_exercise_sessions__session_id__exercises__exercise_id__save_diagram_urls_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveDiagramUrlsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_sessions__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/set-diagram-urls":{"post":{"tags":["exercise_sessions"],"summary":"Set Diagram Urls","description":"Set diagram image URLs for an exercise (overwrites existing)","operationId":"set_diagram_urls_exercise_sessions__session_id__exercises__exercise_id__set_diagram_urls_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveDiagramUrlsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_sessions__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/clear-solution":{"post":{"tags":["exercise_sessions"],"summary":"Clear Exercise Solution","description":"Clear the solution for a specific exercise, removing transcribed solution, images, and diagram images.","operationId":"clear_exercise_solution_exercise_sessions__session_id__exercises__exercise_id__clear_solution_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_sessions__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/pdf":{"get":{"tags":["exercise_sessions"],"summary":"Download Session Pdf","description":"Generate and download a PDF of the exercise session with only exercises (no solutions).","operationId":"download_session_pdf_exercise_sessions__session_id__pdf_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/review-requests":{"post":{"tags":["exercise_sessions"],"summary":"Create Review Request","operationId":"create_review_request_exercise_sessions__session_id__exercises__exercise_id__review_requests_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequestCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequestActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/review-requests/{request_id}":{"delete":{"tags":["exercise_sessions"],"summary":"Cancel Review Request","operationId":"cancel_review_request_exercise_sessions__session_id__exercises__exercise_id__review_requests__request_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequestActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/review-requests-summary":{"get":{"tags":["exercise_sessions"],"summary":"Get Review Requests Summary","operationId":"get_review_requests_summary_exercise_sessions__session_id__review_requests_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequestSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mobile-upload/session":{"post":{"tags":["Mobile Upload"],"summary":"Create Mobile Upload Session","operationId":"create_mobile_upload_session_mobile_upload_session_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/mobile-upload/{secret_key}/status":{"get":{"tags":["Mobile Upload"],"summary":"Get Mobile Upload Status","description":"Mobile polls this endpoint to check if the session is still valid.\nIf valid:\n  - we update last_polled_at to keep the session alive\n  - return { \"status\": \"valid\" }\nOtherwise, raise HTTP errors.","operationId":"get_mobile_upload_status_mobile_upload__secret_key__status_get","parameters":[{"name":"secret_key","in":"path","required":true,"schema":{"type":"string","title":"Secret Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mobile-upload/{secret_key}/images":{"post":{"tags":["Mobile Upload"],"summary":"Upload Mobile Images","operationId":"upload_mobile_images_mobile_upload__secret_key__images_post","parameters":[{"name":"secret_key","in":"path","required":true,"schema":{"type":"string","title":"Secret Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__mobile_upload__ImageUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Mobile Upload"],"summary":"Poll Mobile Images","operationId":"poll_mobile_images_mobile_upload__secret_key__images_get","parameters":[{"name":"secret_key","in":"path","required":true,"schema":{"type":"string","title":"Secret Key"}},{"name":"qr_visible","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Qr Visible"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mobile-upload/active-session":{"get":{"tags":["Mobile Upload"],"summary":"Get Active Mobile Upload Session","description":"Phone app: is there a desktop QR modal currently displayed for my account?\nReturns { \"key\": str | None }.","operationId":"get_active_mobile_upload_session_mobile_upload_active_session_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/demo-homework-helper/scan-exercise":{"post":{"tags":["Demo Homework Helper"],"summary":"Demo Scan Exercise","description":"1) Convert image URL to LaTeX (demo)\n2) Return { latex } but DO NOT create ephemeral doc","operationId":"demo_scan_exercise_demo_homework_helper_scan_exercise_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_homework_helper__ScanExerciseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_homework_helper__ScanExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-homework-helper/create-exercise":{"post":{"tags":["Demo Homework Helper"],"summary":"Demo Create Exercise","description":"1) Accept user-refined latex_content for the ephemeral session\n2) Insert ephemeral doc with no solution\n3) fetch_and_store_solution_in_memory in the background\n4) Return { exercise_id } in the data","operationId":"demo_create_exercise_demo_homework_helper_create_exercise_post","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Ephemeral session ID for the demo","title":"Session Id"},"description":"Ephemeral session ID for the demo"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code, 'EN' or 'FR', for the demo","default":"EN","title":"Lang"},"description":"Language code, 'EN' or 'FR', for the demo"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateExerciseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_homework_helper__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-homework-helper/exercises":{"get":{"tags":["Demo Homework Helper"],"summary":"Get Exercises","description":"Return ephemeral exercises for this session (exclude solution).\nIf no exercises exist, create a placeholder one.","operationId":"get_exercises_demo_homework_helper_exercises_get","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Ephemeral session ID for the demo","title":"Session Id"},"description":"Ephemeral session ID for the demo"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code for the demo","default":"EN","title":"Lang"},"description":"Language code for the demo"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Exercises Demo Homework Helper Exercises Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-homework-helper/exercises/{exercise_id}":{"get":{"tags":["Demo Homework Helper"],"summary":"Get Single Exercise","description":"Return ephemeral exercise by ID","operationId":"get_single_exercise_demo_homework_helper_exercises__exercise_id__get","parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Demo session ID","title":"Session Id"},"description":"Demo session ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Single Exercise Demo Homework Helper Exercises  Exercise Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Demo Homework Helper"],"summary":"Delete Exercise","description":"Delete ephemeral exercise from memory","operationId":"delete_exercise_demo_homework_helper_exercises__exercise_id__delete","parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Demo session ID","title":"Session Id"},"description":"Demo session ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-homework-helper/chat":{"post":{"tags":["Demo Homework Helper"],"summary":"Send Chat Message","description":"Append user's message to ephemeral conversation_history","operationId":"send_chat_message_demo_homework_helper_chat_post","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Demo session ID","title":"Session Id"},"description":"Demo session ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_homework_helper__ChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_homework_helper__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-homework-helper/chat/stream":{"get":{"tags":["Demo Homework Helper"],"summary":"Stream Chat Response","description":"Streams GPT's reply for a given ephemeral exercise, using SSE.\nWe only send last 10 messages + a system prompt built from\nthe latex_content + doc's solution, in the specified language.","operationId":"stream_chat_response_demo_homework_helper_chat_stream_get","parameters":[{"name":"exercise_id","in":"query","required":true,"schema":{"type":"string","description":"Which exercise?","title":"Exercise Id"},"description":"Which exercise?"},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Demo session ID","title":"Session Id"},"description":"Demo session ID"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code for the demo","default":"EN","title":"Lang"},"description":"Language code for the demo"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-homework-helper/generate-similar/{exercise_id}":{"post":{"tags":["Demo Homework Helper"],"summary":"Generate Similar Exercise","description":"Generate a new ephemeral doc with \"similar\" latex content,\nusing chat completions or any approach, matching the original code,\nbut ignoring user auth or DB.  We still accept lang.","operationId":"generate_similar_exercise_demo_homework_helper_generate_similar__exercise_id__post","parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Demo session ID","title":"Session Id"},"description":"Demo session ID"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code for the demo","default":"EN","title":"Lang"},"description":"Language code for the demo"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_homework_helper__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-homework-helper/{exercise_id}/audio":{"post":{"tags":["Demo Homework Helper"],"summary":"Upload Audio","description":"Transcribe user audio => store transcript in ephemeral conversation_history (demo).\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_audio_demo_homework_helper__exercise_id__audio_post","parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Demo session ID","title":"Session Id"},"description":"Demo session ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_homework_helper__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-homework-helper/{exercise_id}/title":{"put":{"tags":["Demo Homework Helper"],"summary":"Update Exercise Title","description":"Same logic as original update title, but ephemeral (demo).","operationId":"update_exercise_title_demo_homework_helper__exercise_id__title_put","parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Demo session ID","title":"Session Id"},"description":"Demo session ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TitleUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Exercise Title Demo Homework Helper  Exercise Id  Title Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-homework-helper/{exercise_id}/classify-attempt":{"post":{"tags":["Demo Homework Helper"],"summary":"Classify Attempt","description":"Classify if the student made a good attempt based on their last exchange","operationId":"classify_attempt_demo_homework_helper__exercise_id__classify_attempt_post","parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Demo session ID","title":"Session Id"},"description":"Demo session ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Classify Attempt Demo Homework Helper  Exercise Id  Classify Attempt Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-homework-helper/{exercise_id}/unlock-correction":{"post":{"tags":["Demo Homework Helper"],"summary":"Unlock Correction","description":"Unlock the correction for viewing","operationId":"unlock_correction_demo_homework_helper__exercise_id__unlock_correction_post","parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Demo session ID","title":"Session Id"},"description":"Demo session ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-homework-helper/chat-history":{"get":{"tags":["Demo Homework Helper"],"summary":"Get Chat History","description":"Fetch the conversation history for all exercises in the demo session.","operationId":"get_chat_history_demo_homework_helper_chat_history_get","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Demo session ID","title":"Session Id"},"description":"Demo session ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/routers__demo_homework_helper__ChatHistoryResponse"},"title":"Response Get Chat History Demo Homework Helper Chat History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-homework-helper/{exercise_id}/conversation/reset":{"post":{"tags":["Demo Homework Helper"],"summary":"Reset Conversation","description":"Reset conversation history in session data.","operationId":"reset_conversation_demo_homework_helper__exercise_id__conversation_reset_post","parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Session ID for demo","title":"Session Id"},"description":"Session ID for demo"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_homework_helper__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-custom-course":{"post":{"tags":["Demo Custom Course"],"summary":"Create Custom Course","description":"Create a new custom course in ephemeral storage.\nInstead of storing in DB, we store in DEMO_COURSE_SESSIONS.","operationId":"create_custom_course_demo_custom_course_post","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Ephemeral session ID","title":"Session Id"},"description":"Ephemeral session ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomCourseCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_custom_course__CustomCourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-custom-course/list":{"get":{"tags":["Demo Custom Course"],"summary":"List Custom Courses","description":"List all ephemeral custom courses for this session.","operationId":"list_custom_courses_demo_custom_course_list_get","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Ephemeral session ID","title":"Session Id"},"description":"Ephemeral session ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/routers__demo_custom_course__CustomCourseResponse"},"title":"Response List Custom Courses Demo Custom Course List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-custom-course/{course_id}/content":{"post":{"tags":["Demo Custom Course"],"summary":"Add Course Content","description":"Add new content to the ephemeral custom course doc.","operationId":"add_course_content_demo_custom_course__course_id__content_post","parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseContentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_custom_course__CustomCourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-custom-course/scan":{"post":{"tags":["Demo Custom Course"],"summary":"Scan Course Content","description":"Scan an image or PDF and convert it to LaTeX using OpenAI's Vision API.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"scan_course_content_demo_custom_course_scan_post","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Ephemeral session ID","title":"Session Id"},"description":"Ephemeral session ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanFileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Scan Course Content Demo Custom Course Scan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-custom-course/{course_id}":{"delete":{"tags":["Demo Custom Course"],"summary":"Delete Course","description":"Delete the entire ephemeral custom course doc from memory.","operationId":"delete_course_demo_custom_course__course_id__delete","parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Demo Custom Course"],"summary":"Get Custom Course","description":"Return ephemeral custom course doc by ID.","operationId":"get_custom_course_demo_custom_course__course_id__get","parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_custom_course__CustomCourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-custom-course/{course_id}/content/{content_index}":{"delete":{"tags":["Demo Custom Course"],"summary":"Remove Course Content","description":"Remove a single piece of content from ephemeral doc.","operationId":"remove_course_content_demo_custom_course__course_id__content__content_index__delete","parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"content_index","in":"path","required":true,"schema":{"type":"integer","title":"Content Index"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_custom_course__CustomCourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-custom-course/{course_id}/content/insert":{"post":{"tags":["Demo Custom Course"],"summary":"Insert Course Content","description":"Insert new content at a specific index in ephemeral doc.","operationId":"insert_course_content_demo_custom_course__course_id__content_insert_post","parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseContentInsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_custom_course__CustomCourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-custom-course/{course_id}/conversation":{"post":{"tags":["Demo Custom Course"],"summary":"Continue Custom Course Conversation","description":"Append user's message to ephemeral conversation_history.","operationId":"continue_custom_course_conversation_demo_custom_course__course_id__conversation_post","parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_custom_course__ConversationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_custom_course__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-custom-course/{course_id}/conversation/stream":{"get":{"tags":["Demo Custom Course"],"summary":"Stream Custom Course Conversation","description":"Streams GPT's reply for a custom course doc,\nusing ephemeral conversation_history in memory.\nWe keep the same SSE approach from your original code,\nbut no DB or user references.\n\nWe add 'lang' so we can pass it to get_prompt_data(...)\nto pick the correct language prompts if needed.","operationId":"stream_custom_course_conversation_demo_custom_course__course_id__conversation_stream_get","parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Ephemeral session ID","title":"Session Id"},"description":"Ephemeral session ID"},{"name":"token","in":"query","required":false,"schema":{"type":"string","description":"Unused here, but keep the same signature","default":"","title":"Token"},"description":"Unused here, but keep the same signature"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code, 'EN' or 'FR'","default":"EN","title":"Lang"},"description":"Language code, 'EN' or 'FR'"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-custom-course/upload-image":{"post":{"tags":["Demo Custom Course"],"summary":"Upload Student Image","description":"Upload an image file to S3 and return a fake URL (for demo).\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_student_image_demo_custom_course_upload_image_post","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Ephemeral session ID","title":"Session Id"},"description":"Ephemeral session ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_custom_course__ImageUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-custom-course/{course_id}/audio":{"post":{"tags":["Demo Custom Course"],"summary":"Upload Custom Course Audio","description":"Upload and transcribe audio for a custom course (demo).\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_custom_course_audio_demo_custom_course__course_id__audio_post","parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_custom_course__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-custom-course/{course_id}/chat-history":{"get":{"tags":["Demo Custom Course"],"summary":"Get Demo Custom Course Chat History","description":"Fetch the conversation history for a demo custom course.","operationId":"get_demo_custom_course_chat_history_demo_custom_course__course_id__chat_history_get","parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Demo session ID","title":"Session Id"},"description":"Demo session ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_custom_course__ChatHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo-custom-course/{course_id}/conversation/reset":{"post":{"tags":["Demo Custom Course"],"summary":"Reset Conversation","description":"Reset conversation history in session data.","operationId":"reset_conversation_demo_custom_course__course_id__conversation_reset_post","parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"session_id","in":"query","required":true,"schema":{"type":"string","description":"Session ID for demo","title":"Session Id"},"description":"Session ID for demo"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__demo_custom_course__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo/collect-email":{"post":{"tags":["Demo Demo"],"summary":"Demo Collect Email","description":"Stores the user's email in a 'demo_emails' collection,\nskipping user creation. Avoids duplicates by checking first.\n\n- If new email => insert + posthog.capture(\"demo email collected\")\n- If existing email => no insert, but still posthog.identify(...)\n                      and sentry set_user.","operationId":"demo_collect_email_demo_collect_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo/google/login":{"get":{"tags":["Demo Demo"],"summary":"Google Demo Login","description":"Redirects user to Google's OAuth 2.0 consent screen,\njust like in auth_google.py but for the 'demo' flow.","operationId":"google_demo_login_demo_google_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/demo/google/callback":{"get":{"tags":["Demo Demo"],"summary":"Google Demo Callback","description":"Minimal callback to just capture user's Google email in 'demo_emails'.\nThen returns a small HTML page that:\n  - calls window.opener.postMessage(...)\n  - then window.close()\nThe parent window can handle the postMessage event and keep the user on the same page.","operationId":"google_demo_callback_demo_google_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/deterministic-tex/preview":{"post":{"tags":["Admin Tools"],"summary":"Preview Conversion","description":"Return deterministic Markdown + LaTeX outputs for provided HTML.","operationId":"preview_conversion_admin_deterministic_tex_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvertRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvertResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/deterministic-tex/pdf":{"post":{"tags":["Admin Tools"],"summary":"Download Test Pdf","description":"Compile converted LaTeX into a minimal PDF for validation.","operationId":"download_test_pdf_admin_deterministic_tex_pdf_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PdfRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/deterministic-tex/random":{"get":{"tags":["Admin Tools"],"summary":"Get Random Html Snippet","description":"Fetch random HTML/KaTeX snippet for testing.","operationId":"get_random_html_snippet_admin_deterministic_tex_random_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"source","in":"query","required":false,"schema":{"enum":["teacher_exam","public_exercise"],"type":"string","default":"teacher_exam","title":"Source"}},{"name":"field","in":"query","required":false,"schema":{"enum":["content","solution"],"type":"string","default":"content","title":"Field"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RandomHtmlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pdf-failures":{"get":{"tags":["Admin Tools"],"summary":"List Pdf Failures","operationId":"list_pdf_failures_admin_pdf_failures_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["new","in-progress","done"],"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PdfFailureListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pdf-failures/stats":{"get":{"tags":["Admin Tools"],"summary":"Get Pdf Download Stats","description":"Get aggregate statistics for PDF downloads by outcome.","operationId":"get_pdf_download_stats_admin_pdf_failures_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PdfDownloadStatsResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/pdf-failures/{failure_id}":{"get":{"tags":["Admin Tools"],"summary":"Get Pdf Failure Detail","operationId":"get_pdf_failure_detail_admin_pdf_failures__failure_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"failure_id","in":"path","required":true,"schema":{"type":"string","title":"Failure Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PdfFailureDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pdf-failures/{failure_id}/status":{"patch":{"tags":["Admin Tools"],"summary":"Update Pdf Failure Status","operationId":"update_pdf_failure_status_admin_pdf_failures__failure_id__status_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"failure_id","in":"path","required":true,"schema":{"type":"string","title":"Failure Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__admin_pdf_failures__UpdateStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/pdf-failures/{failure_id}/reply":{"post":{"tags":["Admin Tools"],"summary":"Send Pdf Failure Reply","operationId":"send_pdf_failure_reply_admin_pdf_failures__failure_id__reply_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"failure_id","in":"path","required":true,"schema":{"type":"string","title":"Failure Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__admin_pdf_failures__SendReplyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/create-checkout-session":{"post":{"tags":["billing"],"summary":"Create Checkout Session","description":"Create a Stripe Checkout Session for the bundle subscription","operationId":"create_checkout_session_billing_create_checkout_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/billing/create-holiday-workbook-checkout-session":{"post":{"tags":["billing"],"summary":"Create Holiday Workbook Checkout Session","description":"Create a Stripe Checkout Session for a one-time purchase of the Holiday Workbook","operationId":"create_holiday_workbook_checkout_session_billing_create_holiday_workbook_checkout_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayWorkbookCheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/billing/webhook":{"post":{"tags":["billing"],"summary":"Stripe Webhook","description":"Handle Stripe webhook events","operationId":"stripe_webhook_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/payment/success":{"get":{"tags":["billing"],"summary":"Payment Success","description":"Verify payment and redirect user after successful checkout","operationId":"payment_success_billing_payment_success_get","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/holiday-workbook/success":{"get":{"tags":["billing"],"summary":"Holiday Workbook Payment Success","description":"Verify payment and grant access as a fallback to the webhook.\nRedirects user after successful checkout.","operationId":"holiday_workbook_payment_success_billing_holiday_workbook_success_get","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/settings":{"get":{"tags":["Settings"],"summary":"Get Settings","description":"Retrieve the authenticated user's preferred model.\nDefaults to 'standard' if no preference has been set.","operationId":"get_settings_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettingsResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["Settings"],"summary":"Update Settings","description":"Update the authenticated user's preferred model.","operationId":"update_settings_settings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettingsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/email-test/send":{"post":{"tags":["admin"],"summary":"Send Test Email","operationId":"send_test_email_admin_email_test_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendTestEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendTestEmailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/homework-logs":{"get":{"tags":["admin"],"summary":"Get Homework Logs","description":"Retrieve homework exercise logs with conversation history or image URLs.\nOnly accessible by admin users.","operationId":"get_homework_logs_admin_homework_logs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExerciseLog"},"title":"Response Get Homework Logs Admin Homework Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-logs":{"get":{"tags":["admin"],"summary":"Get Transcription Logs","description":"Retrieve transcription history logs with pagination and date filtering.\nOnly accessible by admin users.\n\nImplements a three-tier fallback system:\n1. Normal mode: Full query with lookup and sorting\n2. Fallback mode: Simplified query without lookup\n3. Single record mode: Returns only one record, no sorting","operationId":"get_transcription_logs_admin_transcription_logs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"user_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}},{"name":"fallback_mode","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"Fallback Mode"}},{"name":"single_record","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"Single Record"}},{"name":"sanity_check_refused_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Sanity Check Refused Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionLogResponse"},"title":"Response Get Transcription Logs Admin Transcription Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-edit-logs":{"get":{"tags":["admin"],"summary":"Get Transcription Edit Logs","description":"Retrieve transcription edit logs along with summary stats.","operationId":"get_transcription_edit_logs_admin_transcription_edit_logs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"user_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},{"name":"session_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},{"name":"exercise_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Id"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["initial","manual_edit","ai_edit","refused"],"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionEditLogListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/us_student":{"get":{"tags":["admin"],"summary":"Get Us Student","description":"Returns all users with role='us_student'.","operationId":"get_us_student_admin_us_student_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/StudentUSOut"},"type":"array","title":"Response Get Us Student Admin Us Student Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/topics":{"get":{"tags":["admin"],"summary":"Get All Topics","description":"Returns all topics in the DB.","operationId":"get_all_topics_admin_topics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TopicOut"},"type":"array","title":"Response Get All Topics Admin Topics Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["admin"],"summary":"Create Topic","description":"Create a new topic with provided fields.\nReturn the created topic details.","operationId":"create_topic_admin_topics_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/users-us/{user_id}/sessions":{"post":{"tags":["admin"],"summary":"Create Session For User","description":"Create a new session for a user.","operationId":"create_session_for_user_admin_users_us__user_id__sessions_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["admin"],"summary":"Get User Sessions","description":"Get all sessions for a user with topic info and feedback.","operationId":"get_user_sessions_admin_users_us__user_id__sessions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSessions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Update User Sessions","description":"Update a user's next_sessions list.","operationId":"update_user_sessions_admin_users_us__user_id__sessions_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/topics/{topic_id}":{"get":{"tags":["admin"],"summary":"Get Topic Details","description":"Fetch full details of a topic for editing, including latex_*, images_*.\nOnly accessible by admin.","operationId":"get_topic_details_admin_topics__topic_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"string","title":"Topic Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Update Topic Details","description":"Update the given topic with new LaTeX or images arrays.\nReturn the updated topic.","operationId":"update_topic_details_admin_topics__topic_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"string","title":"Topic Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings/{key}":{"get":{"tags":["admin"],"summary":"Get System Setting","description":"Retrieve a system setting by key.\nOnly accessible by admin users.","operationId":"get_system_setting_admin_settings__key__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemSettingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Update System Setting","description":"Update a system setting by key.\nOnly accessible by admin users.","operationId":"update_system_setting_admin_settings__key__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemSetting"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemSettingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings":{"get":{"tags":["admin"],"summary":"Get All System Settings","description":"Retrieve all system settings.\nOnly accessible by admin users.","operationId":"get_all_system_settings_admin_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SystemSettingResponse"},"type":"array","title":"Response Get All System Settings Admin Settings Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/topics/{topic_id}/status":{"put":{"tags":["admin"],"summary":"Update Topic Status","description":"Update the status flag of a topic.","operationId":"update_topic_status_admin_topics__topic_id__status_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"string","title":"Topic Id"}},{"name":"status","in":"query","required":true,"schema":{"enum":["undetermined","wrong","to_edit","ready"],"type":"string","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/course-hierarchies":{"get":{"tags":["admin"],"summary":"Get Course Hierarchies","description":"Get all course hierarchies from the database.","operationId":"get_course_hierarchies_admin_course_hierarchies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Get Course Hierarchies Admin Course Hierarchies Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/course-hierarchies/{course_id}":{"get":{"tags":["admin"],"summary":"Get Course Hierarchy","description":"Get a specific course hierarchy by its course_id.","operationId":"get_course_hierarchy_admin_course_hierarchies__course_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Course Hierarchy Admin Course Hierarchies  Course Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/course-hierarchies/add-topic":{"post":{"tags":["admin"],"summary":"Add Topic To Hierarchy","description":"Add a new topic to a course hierarchy.","operationId":"add_topic_to_hierarchy_admin_course_hierarchies_add_topic_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewTopicRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/course-hierarchies/create-topic-document":{"post":{"tags":["admin"],"summary":"Create Topic Document","description":"Create a new Topic document with the given title.","operationId":"create_topic_document_admin_course_hierarchies_create_topic_document_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/course-hierarchies/update-topic":{"put":{"tags":["admin"],"summary":"Update Topic In Hierarchy","description":"Update a topic's title and number in both the hierarchy and topics collection.","operationId":"update_topic_in_hierarchy_admin_course_hierarchies_update_topic_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTopicRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/topics/{topic_id}/generate":{"post":{"tags":["admin"],"summary":"Generate Topic Content","description":"Generate content for a topic using AI.","operationId":"generate_topic_content_admin_topics__topic_id__generate_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the topic to generate content for","title":"Topic Id"},"description":"The ID of the topic to generate content for"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateContentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Topic Content Admin Topics  Topic Id  Generate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/classes":{"get":{"tags":["admin"],"summary":"Get All Classes","description":"Get all classes with teacher info and student counts for admin dashboard.","operationId":"get_all_classes_admin_classes_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/classes/{class_id}/grade":{"put":{"tags":["admin"],"summary":"Update Admin Class Grade","operationId":"update_admin_class_grade_admin_classes__class_id__grade_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAdminClassGradeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/classes":{"post":{"tags":["admin"],"summary":"Add Student To Class As Admin","operationId":"add_student_to_class_as_admin_admin_users__user_id__classes_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminAddStudentToClassBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminAddStudentToClassResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teachers/{teacher_id}/classes":{"post":{"tags":["admin"],"summary":"Create Teacher Class","description":"Create a class on behalf of a teacher, optionally with its student roster.\nThe class is indistinguishable from one the teacher created themselves.","operationId":"create_teacher_class_admin_teachers__teacher_id__classes_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"teacher_id","in":"path","required":true,"schema":{"type":"string","title":"Teacher Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminCreateTeacherClassRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTeacherClassResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/classes/{class_id}/pending-students":{"post":{"tags":["admin"],"summary":"Add Pending Students To Class","description":"Add students to an existing class's roster on behalf of its teacher.\nNames already on the roster are skipped.","operationId":"add_pending_students_to_class_admin_classes__class_id__pending_students_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminAddPendingStudentsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTeacherClassResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/classes/{class_id}":{"get":{"tags":["admin"],"summary":"Get Class Details","description":"Get detailed information about a class, including student info and contact details.","operationId":"get_class_details_admin_classes__class_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users":{"get":{"tags":["admin"],"summary":"Get All Users","description":"Get all users with filters for admin dashboard.","operationId":"get_all_users_admin_users_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by email or full name","title":"Search"},"description":"Search by email or full name"},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}":{"get":{"tags":["admin"],"summary":"Get User Detail","description":"Everything the admin user card needs about one account: identity, auth\nprovider, role flags, derived platform access, schools and classes.","operationId":"get_user_detail_admin_users__user_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/subject":{"patch":{"tags":["admin"],"summary":"Update User Subject","description":"Set a teacher's matière from the admin dashboard. This is the support\nescape hatch: the self-service toggle (multi-matière branch) locks as soon\nas the teacher has authored content.","operationId":"update_user_subject_admin_users__user_id__subject_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserSubjectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserSubjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/role":{"patch":{"tags":["admin"],"summary":"Update User Role","description":"Update a user's role from the admin dashboard.","operationId":"update_user_role_admin_users__user_id__role_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserRoleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserRoleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/email":{"patch":{"tags":["admin"],"summary":"Update User Email","description":"Update a user's email address from the admin dashboard.","operationId":"update_user_email_admin_users__user_id__email_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserEmailRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserEmailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/name":{"patch":{"tags":["admin"],"summary":"Update User Name","description":"Update a user's first and/or last name from the admin dashboard.","operationId":"update_user_name_admin_users__user_id__name_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserNameRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserNameResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/resend-teacher-welcome-email":{"post":{"tags":["admin"],"summary":"Resend Teacher Welcome Email","description":"Resend the teacher welcome email (\"Bienvenue sur Excellence !\") to a teacher.","operationId":"resend_teacher_welcome_email_admin_users__user_id__resend_teacher_welcome_email_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendTeacherWelcomeEmailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/upload-media":{"post":{"tags":["admin"],"summary":"Upload Admin Media","operationId":"upload_admin_media_admin_upload_media_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__admin__FileUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upload Admin Media Admin Upload Media Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/agent-sessions":{"get":{"tags":["admin"],"summary":"Get Agent Sessions","description":"Get all agent sessions, with optional filtering and pagination.\nOnly accessible by admin users.","operationId":"get_agent_sessions_admin_agent_sessions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by session status (active, completed, failed)","title":"Status"},"description":"Filter by session status (active, completed, failed)"},{"name":"agent_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by agent type","title":"Agent Type"},"description":"Filter by agent type"},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of records to skip","default":0,"title":"Skip"},"description":"Number of records to skip"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of records to return","default":100,"title":"Limit"},"description":"Maximum number of records to return"},{"name":"sort_by","in":"query","required":false,"schema":{"enum":["start_time","end_time"],"type":"string","description":"Field to sort by","default":"start_time","title":"Sort By"},"description":"Field to sort by"},{"name":"sort_order","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order","default":"desc","title":"Sort Order"},"description":"Sort order"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter sessions starting from this date (ISO format)","title":"Start Date"},"description":"Filter sessions starting from this date (ISO format)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter sessions until this date (ISO format)","title":"End Date"},"description":"Filter sessions until this date (ISO format)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AgentSessionResponse"},"title":"Response Get Agent Sessions Admin Agent Sessions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/agent-sessions/{session_id}":{"get":{"tags":["admin"],"summary":"Get Agent Session","description":"Get details of a specific agent session by ID.\nOnly accessible by admin users.","operationId":"get_agent_session_admin_agent_sessions__session_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/export":{"get":{"tags":["admin"],"summary":"Export Users","description":"Export user data as CSV or get a count and sample.\nFilters by role and grade.","operationId":"export_users_admin_users_export_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},{"name":"grade","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade"}},{"name":"download","in":"query","required":false,"schema":{"type":"boolean","description":"Set to true to download CSV","default":false,"title":"Download"},"description":"Set to true to download CSV"}],"responses":{"200":{"description":"A CSV file of the exported users. When download=true, this media type is returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserExportResponse"}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/exercise-reports":{"get":{"tags":["admin"],"summary":"Get Exercise Reports","description":"Get all exercise reports with their associated exercise and user information.\nOnly admins can access this endpoint.","operationId":"get_exercise_reports_admin_exercise_reports_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExerciseReportResponse"},"title":"Response Get Exercise Reports Admin Exercise Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/exercise-reports/{report_id}":{"put":{"tags":["admin"],"summary":"Update Exercise Report Status","description":"Update the status of an exercise report.\nOnly admins can access this endpoint.","operationId":"update_exercise_report_status_admin_exercise_reports__report_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-approvals":{"get":{"tags":["admin"],"summary":"Get Teacher Approvals","description":"Get teachers for approval management.","operationId":"get_teacher_approvals_admin_teacher_approvals_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by email or name","title":"Search"},"description":"Search by email or name"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by approval status: all, pending, approved, rejected","default":"pending","title":"Status"},"description":"Filter by approval status: all, pending, approved, rejected"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherApprovalsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-approvals/{teacher_id}/approve":{"patch":{"tags":["admin"],"summary":"Approve Teacher","description":"Approve a teacher account.","operationId":"approve_teacher_admin_teacher_approvals__teacher_id__approve_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"teacher_id","in":"path","required":true,"schema":{"type":"string","title":"Teacher Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-approvals/{teacher_id}/reject":{"patch":{"tags":["admin"],"summary":"Reject Teacher","description":"Reject a teacher account.","operationId":"reject_teacher_admin_teacher_approvals__teacher_id__reject_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"teacher_id","in":"path","required":true,"schema":{"type":"string","title":"Teacher Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/unassigned-teachers":{"get":{"tags":["admin"],"summary":"Get Unassigned Teachers","description":"Get teachers who are not assigned to any school.\nA teacher is considered unassigned when they are not in any active\nschool_membership (the email domain is not a source of affiliation).","operationId":"get_unassigned_teachers_admin_unassigned_teachers_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by email or name","title":"Search"},"description":"Search by email or name"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherApprovalsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teachers/{teacher_id}/toggle-active":{"patch":{"tags":["admin"],"summary":"Toggle Teacher Active Status","description":"Toggle a teacher's active status (enable/disable their account).\nThis is different from approval - it's for temporarily disabling accounts.","operationId":"toggle_teacher_active_status_admin_teachers__teacher_id__toggle_active_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"teacher_id","in":"path","required":true,"schema":{"type":"string","title":"Teacher Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/custom-school-teachers":{"get":{"tags":["admin"],"summary":"Get Custom School Teachers","description":"Get teachers who entered custom school information (school not found in database).","operationId":"get_custom_school_teachers_admin_custom_school_teachers_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by email, name, or school","title":"Search"},"description":"Search by email, name, or school"},{"name":"validated","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by validation status: true, false, or null for all","title":"Validated"},"description":"Filter by validation status: true, false, or null for all"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomSchoolTeachersListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teachers/{teacher_id}/validate-custom-school":{"patch":{"tags":["admin"],"summary":"Validate Custom School","description":"Validate a teacher's custom school entry and optionally add it to the schools database.","operationId":"validate_custom_school_admin_teachers__teacher_id__validate_custom_school_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"teacher_id","in":"path","required":true,"schema":{"type":"string","title":"Teacher Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateCustomSchoolRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teachers/{teacher_id}/update-establishment":{"patch":{"tags":["admin"],"summary":"Update Teacher Establishment","description":"Update a teacher's establishment field directly (for corrections).","operationId":"update_teacher_establishment_admin_teachers__teacher_id__update_establishment_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"teacher_id","in":"path","required":true,"schema":{"type":"string","title":"Teacher Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_teacher_establishment_admin_teachers__teacher_id__update_establishment_patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-metrics":{"get":{"tags":["admin"],"summary":"Get Teacher Metrics","description":"Get teacher activation metrics including funnel and time-to-action metrics.\n\nFunnel steps:\n1. Started signup (created account as teacher)\n2. Pending validation (completed onboarding, waiting for approval)\n3. Profile validated (is_approved = True)\n4. First assignment created","operationId":"get_teacher_metrics_admin_teacher_metrics_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Number of days to look back","default":30,"title":"Days"},"description":"Number of days to look back"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-exams":{"get":{"tags":["Admin Teacher Exams"],"summary":"Get All Teacher Exams","description":"Get all teacher exams across the platform with filtering and pagination.","operationId":"get_all_teacher_exams_admin_teacher_exams_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by exam title, teacher name, or email","title":"Search"},"description":"Search by exam title, teacher name, or email"},{"name":"teacher_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by teacher ID","title":"Teacher Id"},"description":"Filter by teacher ID"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter exams created from this date (YYYY-MM-DD)","title":"Date From"},"description":"Filter exams created from this date (YYYY-MM-DD)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter exams created until this date (YYYY-MM-DD)","title":"Date To"},"description":"Filter exams created until this date (YYYY-MM-DD)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":50,"title":"Limit"},"description":"Items per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTeacherExamsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-exams/{exam_id}":{"get":{"tags":["Admin Teacher Exams"],"summary":"Get Teacher Exam Detail","description":"Get detailed information about a specific teacher exam.","operationId":"get_teacher_exam_detail_admin_teacher_exams__exam_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTeacherExamDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin Teacher Exams"],"summary":"Delete Teacher Exam","description":"Delete a teacher exam and all associated data.","operationId":"delete_teacher_exam_admin_teacher_exams__exam_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-exams/{exam_id}/content":{"put":{"tags":["Admin Teacher Exams"],"summary":"Update Exam Content","description":"Update exam content (creates a new version).","operationId":"update_exam_content_admin_teacher_exams__exam_id__content_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminExamContentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-exams/{exam_id}/pdf":{"post":{"tags":["Admin Teacher Exams"],"summary":"Generate Admin Exam Pdf","description":"Generate PDF for an exam (admin access) - uses exact same logic as teacher version.","operationId":"generate_admin_exam_pdf_admin_teacher_exams__exam_id__pdf_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"include_correction","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Correction"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-exams/{exam_id}/latex":{"get":{"tags":["Admin Teacher Exams"],"summary":"Get Admin Exam Latex","description":"Get the current LaTeX content for an exam (admin access).","operationId":"get_admin_exam_latex_admin_teacher_exams__exam_id__latex_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin Teacher Exams"],"summary":"Update Admin Exam Latex","description":"Update the custom LaTeX content for an exam (admin access).","operationId":"update_admin_exam_latex_admin_teacher_exams__exam_id__latex_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLatexContentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-exams/{exam_id}/latex/pdf":{"post":{"tags":["Admin Teacher Exams"],"summary":"Generate Admin Exam Pdf From Latex","description":"Generate PDF from custom LaTeX content (admin access).","operationId":"generate_admin_exam_pdf_from_latex_admin_teacher_exams__exam_id__latex_pdf_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-exams/{exam_id}/exercises/{exercise_id}/edit-latex-content":{"put":{"tags":["Admin Teacher Exams"],"summary":"Update Admin Exercise Latex Content","description":"Update exercise content directly (admin access mirror of teacher workflow).","operationId":"update_admin_exercise_latex_content_admin_teacher_exams__exam_id__exercises__exercise_id__edit_latex_content_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"integer","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__admin_teacher_exams__UpdateExerciseLatexContentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/copy-correction/stats":{"get":{"tags":["Admin Copy Correction"],"summary":"Get Stats","description":"Get aggregate stats across all copy correction sessions.\n\nSessions created by internal team accounts are excluded so the KPI cards\nreflect real usage (same rule as /metrics).","operationId":"get_stats_admin_copy_correction_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/copy-correction/metrics":{"get":{"tags":["Admin Copy Correction"],"summary":"Get Metrics","description":"Get aggregate metrics across all copy correction sessions, grouped\ninto the four stages of the correction flow.\n\nSessions created by internal team accounts (``@excellence-ai.com``) are\nexcluded so the numbers reflect real user behavior.","operationId":"get_metrics_admin_copy_correction_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/copy-correction/sessions":{"get":{"tags":["Admin Copy Correction"],"summary":"List Sessions","description":"List all copy correction sessions with teacher/exam info.","operationId":"list_sessions_admin_copy_correction_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/copy-correction/sessions/{session_id}":{"get":{"tags":["Admin Copy Correction"],"summary":"Get Session Detail","description":"Get full detail of a session (admin can view any session).","operationId":"get_session_detail_admin_copy_correction_sessions__session_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/copy-correction/csat-summary":{"get":{"tags":["Admin Copy Correction"],"summary":"Get Csat Summary","description":"Get CSAT summary for copy correction (teacher or student).","operationId":"get_csat_summary_admin_copy_correction_csat_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"csat_type","in":"query","required":false,"schema":{"type":"string","default":"copy_correction_grading","title":"Csat Type"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsatSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/copy-correction/csat-reviews":{"get":{"tags":["Admin Copy Correction"],"summary":"Get Csat Reviews","description":"Get paginated CSAT reviews for copy correction (teacher or student).","operationId":"get_csat_reviews_admin_copy_correction_csat_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"csat_type","in":"query","required":false,"schema":{"type":"string","default":"copy_correction_grading","title":"Csat Type"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/routers__admin_copy_correction__CsatReviewItem"},"title":"Response Get Csat Reviews Admin Copy Correction Csat Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/assignments":{"get":{"tags":["Admin - Assignments"],"summary":"Get All Teacher Assignments","description":"Get all teacher assignments across the platform for admin view.\nIncludes teacher and class information.","operationId":"get_all_teacher_assignments_admin_assignments_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Maximum number of assignments to return. Omit to fetch all.","title":"Limit"},"description":"Maximum number of assignments to return. Omit to fetch all."},{"name":"teacher_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by teacher ID","title":"Teacher Id"},"description":"Filter by teacher ID"},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by class ID","title":"Class Id"},"description":"Filter by class ID"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search in assignment titles","title":"Search"},"description":"Search in assignment titles"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminAssignmentResponse"},"title":"Response Get All Teacher Assignments Admin Assignments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/assignments/{assignment_id}":{"get":{"tags":["Admin - Assignments"],"summary":"Get Admin Assignment Details","description":"Get detailed assignment information for admin view.\nThis reuses most of the logic from the teacher endpoint but adds teacher context.","operationId":"get_admin_assignment_details_admin_assignments__assignment_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminAssignmentDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/assignments/teachers/summary":{"get":{"tags":["Admin - Assignments"],"summary":"Get Teachers Assignments Summary","description":"Get a summary of assignments per teacher for admin dashboard.","operationId":"get_teachers_assignments_summary_admin_assignments_teachers_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/assignments/{assignment_id}/run-recorrection":{"post":{"tags":["Admin - Assignments"],"summary":"Run Recorrection","description":"Preview recorrection for submitted exercises in an assignment.\nReruns check_solution() on existing submissions without modifying the DB.\n\nWithout a body, every submission in the assignment is re-corrected. When\n`scope` is provided, only the listed (session_id, exercise_id) pairs are\nre-corrected, which keeps the request fast enough to avoid timing out.","operationId":"run_recorrection_admin_assignments__assignment_id__run_recorrection_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RunRecorrectionRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecorrectionPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/assignments/{assignment_id}/apply-recorrection":{"post":{"tags":["Admin - Assignments"],"summary":"Apply Recorrection","description":"Apply recorrection results to the database.\nUpdates the last submission attempt's correctness and feedback in-place.\nDoes NOT increment attempt_count.","operationId":"apply_recorrection_admin_assignments__assignment_id__apply_recorrection_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyRecorrectionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyRecorrectionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/webinars/slots":{"post":{"tags":["Admin - Webinars"],"summary":"Create Webinar Slot","description":"Create a new webinar slot.\nOnly accessible by admin users.","operationId":"create_webinar_slot_admin_webinars_slots_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarSlotCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarSlotResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Admin - Webinars"],"summary":"List Webinar Slots","description":"List webinar slots with optional filtering and registration information.\nOnly accessible by admin users.","operationId":"list_webinar_slots_admin_webinars_slots_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"description":"Filter by month (1-12)","title":"Month"},"description":"Filter by month (1-12)"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":2020},{"type":"null"}],"description":"Filter by year","title":"Year"},"description":"Filter by year"},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by active status","title":"Is Active"},"description":"Filter by active status"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WebinarSlotResponse"},"title":"Response List Webinar Slots Admin Webinars Slots Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/webinars/slots/{slot_id}":{"put":{"tags":["Admin - Webinars"],"summary":"Update Webinar Slot","description":"Update an existing webinar slot.\nOnly accessible by admin users.","operationId":"update_webinar_slot_admin_webinars_slots__slot_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slot_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the webinar slot to update","title":"Slot Id"},"description":"The ID of the webinar slot to update"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarSlotUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebinarSlotResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin - Webinars"],"summary":"Delete Webinar Slot","description":"Delete a webinar slot.\nOnly accessible by admin users.\n\nNote: This will also delete any associated registrations.\nConsider sending cancellation emails in a future enhancement.","operationId":"delete_webinar_slot_admin_webinars_slots__slot_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slot_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the webinar slot to delete","title":"Slot Id"},"description":"The ID of the webinar slot to delete"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/classes":{"get":{"tags":["Admin - Holiday Courses"],"summary":"List Classes","description":"List all holiday course classes, ordered by order field then by name.\nOnly accessible by admin users.","operationId":"list_classes_admin_holiday_courses_classes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ClasseResponse"},"type":"array","title":"Response List Classes Admin Holiday Courses Classes Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Admin - Holiday Courses"],"summary":"Create Classe","description":"Create a new holiday course classe (grade level).\nOnly accessible by admin users.","operationId":"create_classe_admin_holiday_courses_classes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClasseCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClasseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/holiday-courses/classes/{classe_id}":{"get":{"tags":["Admin - Holiday Courses"],"summary":"Get Classe","description":"Get a single holiday course classe by ID.\nOnly accessible by admin users.","operationId":"get_classe_admin_holiday_courses_classes__classe_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"classe_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course classe","title":"Classe Id"},"description":"The ID of the holiday course classe"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClasseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin - Holiday Courses"],"summary":"Update Classe","description":"Update an existing holiday course classe.\nOnly accessible by admin users.","operationId":"update_classe_admin_holiday_courses_classes__classe_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"classe_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course classe to update","title":"Classe Id"},"description":"The ID of the holiday course classe to update"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClasseUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClasseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin - Holiday Courses"],"summary":"Delete Classe","description":"Delete a holiday course classe and all its associated data.\nThis performs cascading deletion of:\n- All HolidayCourseChapitre documents linked to this classe\n- All HolidayCourseSubChapitre documents linked to those chapitres\n\nTODO: Implement cascading deletion for:\n- HolidayCourseExerciseLink documents linked to sub-chapitres\n- HolidayCourseExercise documents (if not shared)\n- Course content (if source_type=\"holiday_workbook\" and not shared elsewhere)\n\nOnly accessible by admin users.","operationId":"delete_classe_admin_holiday_courses_classes__classe_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"classe_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course classe to delete","title":"Classe Id"},"description":"The ID of the holiday course classe to delete"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/classes/{classe_id}/chapitres":{"post":{"tags":["Admin - Holiday Courses"],"summary":"Create Chapitre","description":"Create a new holiday course chapitre for a specific classe.\nOnly accessible by admin users.","operationId":"create_chapitre_admin_holiday_courses_classes__classe_id__chapitres_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"classe_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course classe","title":"Classe Id"},"description":"The ID of the holiday course classe"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapitreCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapitreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Admin - Holiday Courses"],"summary":"List Chapitres By Classe","description":"List all holiday course chapitres for a specific classe, ordered by order field then by name.\nOnly accessible by admin users.","operationId":"list_chapitres_by_classe_admin_holiday_courses_classes__classe_id__chapitres_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"classe_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course classe","title":"Classe Id"},"description":"The ID of the holiday course classe"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChapitreResponse"},"title":"Response List Chapitres By Classe Admin Holiday Courses Classes  Classe Id  Chapitres Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/chapitres/{chapitre_id}":{"get":{"tags":["Admin - Holiday Courses"],"summary":"Get Chapitre","description":"Get a single holiday course chapitre by ID.\nOnly accessible by admin users.","operationId":"get_chapitre_admin_holiday_courses_chapitres__chapitre_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course chapitre","title":"Chapitre Id"},"description":"The ID of the holiday course chapitre"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapitreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin - Holiday Courses"],"summary":"Update Chapitre","description":"Update an existing holiday course chapitre.\nOnly accessible by admin users.","operationId":"update_chapitre_admin_holiday_courses_chapitres__chapitre_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course chapitre to update","title":"Chapitre Id"},"description":"The ID of the holiday course chapitre to update"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapitreUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapitreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin - Holiday Courses"],"summary":"Delete Chapitre","description":"Delete a holiday course chapitre and all its associated data.\nThis performs cascading deletion of:\n- All HolidayCourseSubChapitre documents linked to this chapitre\n\nTODO: Implement cascading deletion for:\n- HolidayCourseExerciseLink documents linked to sub-chapitres\n- HolidayCourseExercise documents (if not shared)\n- Course content (if source_type=\"holiday_workbook\" and not shared elsewhere)\n\nOnly accessible by admin users.","operationId":"delete_chapitre_admin_holiday_courses_chapitres__chapitre_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course chapitre to delete","title":"Chapitre Id"},"description":"The ID of the holiday course chapitre to delete"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/chapitres/{chapitre_id}/download":{"get":{"tags":["Admin - Holiday Courses"],"summary":"Download Chapitre Content","description":"Download the complete content of a chapitre as a Markdown file.\nAggregates all sub-chapters, their course units, flashcards, and QCMs.\nOnly accessible by admin users.","operationId":"download_chapitre_content_admin_holiday_courses_chapitres__chapitre_id__download_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course chapitre","title":"Chapitre Id"},"description":"The ID of the holiday course chapitre"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/chapitres/{chapitre_id}/subchapitres":{"post":{"tags":["Admin - Holiday Courses"],"summary":"Create Sub Chapitre","description":"Create a new holiday course sub-chapitre for a specific chapitre.\nOnly accessible by admin users.","operationId":"create_sub_chapitre_admin_holiday_courses_chapitres__chapitre_id__subchapitres_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course chapitre","title":"Chapitre Id"},"description":"The ID of the holiday course chapitre"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubChapitreCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubChapitreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Admin - Holiday Courses"],"summary":"List Sub Chapitres By Chapitre","description":"List all holiday course sub-chapitres for a specific chapitre, ordered by order field then by name.\nOnly accessible by admin users.","operationId":"list_sub_chapitres_by_chapitre_admin_holiday_courses_chapitres__chapitre_id__subchapitres_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course chapitre","title":"Chapitre Id"},"description":"The ID of the holiday course chapitre"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SubChapitreResponse"},"title":"Response List Sub Chapitres By Chapitre Admin Holiday Courses Chapitres  Chapitre Id  Subchapitres Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/subchapitres/{sub_chapitre_id}":{"get":{"tags":["Admin - Holiday Courses"],"summary":"Get Sub Chapitre","description":"Get a single holiday course sub-chapitre by ID.\nOnly accessible by admin users.","operationId":"get_sub_chapitre_admin_holiday_courses_subchapitres__sub_chapitre_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course sub-chapitre","title":"Sub Chapitre Id"},"description":"The ID of the holiday course sub-chapitre"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubChapitreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin - Holiday Courses"],"summary":"Update Sub Chapitre","description":"Update an existing holiday course sub-chapitre.\nThis endpoint allows admin to manually set or change course_content_id if needed.\nOnly accessible by admin users.","operationId":"update_sub_chapitre_admin_holiday_courses_subchapitres__sub_chapitre_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course sub-chapitre to update","title":"Sub Chapitre Id"},"description":"The ID of the holiday course sub-chapitre to update"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubChapitreUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubChapitreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin - Holiday Courses"],"summary":"Delete Sub Chapitre","description":"Delete a holiday course sub-chapitre and all its associated data.\nThis performs cascading deletion of:\n- All HolidayCourseExerciseLink documents linked to this sub-chapitre\n\nTODO: Implement full cascading deletion for:\n- HolidayCourseExercise documents (if not shared with other sub-chapitres)\n- Course content cleanup (if course_content_id exists, source_type=\"holiday_workbook\",\n  and not referenced by other SubChapitres - delete Course, Units, Flashcards, QCMs)\n\nOnly accessible by admin users.","operationId":"delete_sub_chapitre_admin_holiday_courses_subchapitres__sub_chapitre_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course sub-chapitre to delete","title":"Sub Chapitre Id"},"description":"The ID of the holiday course sub-chapitre to delete"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/subchapitres/{sub_chapitre_id}/create-course-content":{"post":{"tags":["Admin - Holiday Courses"],"summary":"Create Course Content For Sub Chapitre","description":"Create course content for a holiday course sub-chapitre by uploading images.\nThis endpoint:\n1. Validates that the sub-chapitre exists and doesn't already have content\n2. Uploads the files to S3\n3. Creates a new Course document with status \"UPLOADING\"\n4. Links the new course to the sub-chapitre\n5. Starts a background task to process the course content\n\nOnly accessible by admin users.","operationId":"create_course_content_for_sub_chapitre_admin_holiday_courses_subchapitres__sub_chapitre_id__create_course_content_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course sub-chapitre","title":"Sub Chapitre Id"},"description":"The ID of the holiday course sub-chapitre"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__admin_holiday_courses__BatchFileUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__admin_holiday_courses__CourseUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/subchapitres/{sub_chapitre_id}/create-course-content-from-urls":{"post":{"tags":["Admin - Holiday Courses"],"summary":"Create Course Content From Urls For Sub Chapitre","description":"Create course content for a holiday course sub-chapitre using image URLs.\nThis endpoint:\n1. Validates that the sub-chapitre exists and doesn't already have content\n2. Creates a new Course document with the provided URLs\n3. Links the new course to the sub-chapitre\n4. Starts a background task to process the course content\n\nOnly accessible by admin users.","operationId":"create_course_content_from_urls_for_sub_chapitre_admin_holiday_courses_subchapitres__sub_chapitre_id__create_course_content_from_urls_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course sub-chapitre","title":"Sub Chapitre Id"},"description":"The ID of the holiday course sub-chapitre"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__admin_holiday_courses__CreateCourseFromUrlsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__admin_holiday_courses__CourseUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/courses/{course_id}/structure":{"put":{"tags":["Admin - Holiday Courses"],"summary":"Update Course Structure","description":"Update the entire course structure by replacing the units array.\n\nThis endpoint allows admins to:\n- Reorder units within a course\n- Modify unit titles, summaries, types, and content\n- Add or remove units\n- Update the complete course structure in a single operation\n\nThe endpoint validates that the course is a holiday_workbook type to ensure\nadmins are only structurally editing these types of courses.\n\nOnly accessible by admin users.","operationId":"update_course_structure_admin_holiday_courses_courses__course_id__structure_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the course to update","title":"Course Id"},"description":"The ID of the course to update"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCourseStructureRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/exercises":{"post":{"tags":["Admin - Holiday Courses"],"summary":"Create Holiday Exercise","description":"Create a new holiday course exercise.\n\nThis endpoint allows admins to create standalone exercises that can later\nbe linked to SubChapitres through the exercise linking system.\n\nOnly accessible by admin users.","operationId":"create_holiday_exercise_admin_holiday_courses_exercises_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayExerciseCreatePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Admin - Holiday Courses"],"summary":"List Holiday Exercises","description":"List all holiday course exercises with optional filtering and pagination.\n\nSupports filtering by difficulty level and pagination through limit/skip parameters.\n\nOnly accessible by admin users.","operationId":"list_holiday_exercises_admin_holiday_courses_exercises_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"difficulty","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by difficulty: easy, medium, or hard","title":"Difficulty"},"description":"Filter by difficulty: easy, medium, or hard"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum number of exercises to return","default":50,"title":"Limit"},"description":"Maximum number of exercises to return"},{"name":"skip","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of exercises to skip for pagination","default":0,"title":"Skip"},"description":"Number of exercises to skip for pagination"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HolidayExerciseResponse"},"title":"Response List Holiday Exercises Admin Holiday Courses Exercises Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/exercises/{exercise_id}":{"get":{"tags":["Admin - Holiday Courses"],"summary":"Get Holiday Exercise","description":"Get a single holiday course exercise by ID.\n\nOnly accessible by admin users.","operationId":"get_holiday_exercise_admin_holiday_courses_exercises__exercise_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course exercise","title":"Exercise Id"},"description":"The ID of the holiday course exercise"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin - Holiday Courses"],"summary":"Update Holiday Exercise","description":"Update a holiday course exercise.\n\nAllows updating any combination of title, content, solution, and difficulty.\nUpdates the updated_at timestamp and optionally tracks the last editor.\n\nOnly accessible by admin users.","operationId":"update_holiday_exercise_admin_holiday_courses_exercises__exercise_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course exercise to update","title":"Exercise Id"},"description":"The ID of the holiday course exercise to update"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayExerciseUpdatePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin - Holiday Courses"],"summary":"Delete Holiday Exercise","description":"Delete a holiday course exercise and all its links to SubChapitres.\n\nThis operation:\n1. Deletes the HolidayCourseExercise document\n2. Deletes all HolidayCourseExerciseLink documents that reference this exercise\n\nOnly accessible by admin users.","operationId":"delete_holiday_exercise_admin_holiday_courses_exercises__exercise_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course exercise to delete","title":"Exercise Id"},"description":"The ID of the holiday course exercise to delete"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/exercises/transcribe-image":{"post":{"tags":["Admin - Holiday Courses"],"summary":"Transcribe Exercise Image For Admin","description":"Transcribe an exercise image to LaTeX/HTML for admin exercise creation.\n\nThis endpoint:\n1. Takes a base64-encoded image from the admin\n2. Optionally uploads the original image to S3 for reference\n3. Uses AI transcription service to convert image to LaTeX/HTML\n4. Returns the transcribed content for use in exercise creation\n\nOnly accessible by admin users.","operationId":"transcribe_exercise_image_for_admin_admin_holiday_courses_exercises_transcribe_image_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminExerciseImageUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminExerciseImageTranscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/holiday-courses/exercises/generate-solution":{"post":{"tags":["Admin - Holiday Courses"],"summary":"Generate Exercise Solution For Admin","description":"Generate a plausible solution for an exercise using AI.\n\nThis endpoint:\n1. Takes an exercise statement (LaTeX/HTML) and optional difficulty level\n2. Uses an LLM to generate a step-by-step solution\n3. Returns the generated solution formatted for KaTeX rendering\n\nOnly accessible by admin users.","operationId":"generate_exercise_solution_for_admin_admin_holiday_courses_exercises_generate_solution_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSolutionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSolutionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/holiday-courses/exercises/generate-hints":{"post":{"tags":["Admin - Holiday Courses"],"summary":"Generate Exercise Hints For Admin","description":"Generate hints for an exercise using AI.\n\nThis endpoint:\n1. Takes an exercise statement (LaTeX/HTML) and optional difficulty level\n2. Uses an LLM to generate hints for the exercise\n3. Returns the generated hints formatted for KaTeX rendering\n\nOnly accessible by admin users.","operationId":"generate_exercise_hints_for_admin_admin_holiday_courses_exercises_generate_hints_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateHintsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateHintsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/holiday-courses/subchapitres/{sub_chapitre_id}/link-exercise":{"post":{"tags":["Admin - Holiday Courses"],"summary":"Link Exercise To Sub Chapitre","description":"Link an existing holiday course exercise to a sub-chapitre.\n\nThis endpoint:\n1. Validates that both the sub-chapitre and exercise exist\n2. Prevents duplicate links (same exercise to same sub-chapitre)\n3. Manages the default flag (only one exercise can be default per sub-chapitre)\n4. Creates the HolidayCourseExerciseLink document\n\nOnly accessible by admin users.","operationId":"link_exercise_to_sub_chapitre_admin_holiday_courses_subchapitres__sub_chapitre_id__link_exercise_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course sub-chapitre","title":"Sub Chapitre Id"},"description":"The ID of the holiday course sub-chapitre"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkExerciseToSubChapitrePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedExerciseDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/subchapitres/{sub_chapitre_id}/linked-exercises":{"get":{"tags":["Admin - Holiday Courses"],"summary":"List Linked Exercises For Sub Chapitre","description":"List all exercises linked to a specific sub-chapitre.\n\nReturns detailed information about each linked exercise including\nthe exercise title, difficulty, and content for admin management.\n\nOnly accessible by admin users.","operationId":"list_linked_exercises_for_sub_chapitre_admin_holiday_courses_subchapitres__sub_chapitre_id__linked_exercises_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course sub-chapitre","title":"Sub Chapitre Id"},"description":"The ID of the holiday course sub-chapitre"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LinkedExerciseDetail"},"title":"Response List Linked Exercises For Sub Chapitre Admin Holiday Courses Subchapitres  Sub Chapitre Id  Linked Exercises Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/exercise-links/{link_id}/set-default":{"put":{"tags":["Admin - Holiday Courses"],"summary":"Set Exercise Link As Default","description":"Set a specific exercise link as the default for its sub-chapitre.\n\nThis operation:\n1. Sets is_default_for_sub_chapitre = True for the specified link\n2. Sets is_default_for_sub_chapitre = False for all other links to the same sub-chapitre\n\nOnly accessible by admin users.","operationId":"set_exercise_link_as_default_admin_holiday_courses_exercise_links__link_id__set_default_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the exercise link to set as default","title":"Link Id"},"description":"The ID of the exercise link to set as default"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/exercise-links/{link_id}":{"delete":{"tags":["Admin - Holiday Courses"],"summary":"Unlink Exercise From Sub Chapitre","description":"Unlink an exercise from a sub-chapitre by deleting the link record.\n\nThis removes the HolidayCourseExerciseLink document but does not delete\nthe actual exercise or sub-chapitre - only their association.\n\nOnly accessible by admin users.","operationId":"unlink_exercise_from_sub_chapitre_admin_holiday_courses_exercise_links__link_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the exercise link to delete","title":"Link Id"},"description":"The ID of the exercise link to delete"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/subchapitres/{sub_chapitre_id}/create-course-from-tex":{"post":{"tags":["Admin - Holiday Courses"],"summary":"Create Course Content From Tex","description":"Create a new course from raw LaTeX content.\n\nThis endpoint:\n1. Parses LaTeX content into structured CourseUnit objects using AI\n2. Creates a Course document with holiday_workbook source type\n3. Links the course to the specified HolidayCourseSubChapitre\n4. Generates additional QCM/Flashcard units (background task)\n5. Generates global revision flashcards (background task)","operationId":"create_course_content_from_tex_admin_holiday_courses_subchapitres__sub_chapitre_id__create_course_from_tex_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course sub-chapitre","title":"Sub Chapitre Id"},"description":"The ID of the holiday course sub-chapitre"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCourseFromTexRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCourseFromTexResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/subchapitres/{sub_chapitre_id}/import-tex-exercises":{"post":{"tags":["Admin - Holiday Courses"],"summary":"Import Tex Exercises","description":"Import exercises from LaTeX content using AI to parse, generate solutions and hints.\n\nThis endpoint:\n1. Uses AI to parse the LaTeX content into structured exercises with difficulty levels\n2. For each extracted exercise, generates solutions and hints using AI\n3. Creates HolidayCourseExercise documents in the database\n4. Links them to the specified sub-chapitre\n5. Returns a summary of the import operation","operationId":"import_tex_exercises_admin_holiday_courses_subchapitres__sub_chapitre_id__import_tex_exercises_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course sub-chapitre","title":"Sub Chapitre Id"},"description":"The ID of the holiday course sub-chapitre"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TexImportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TexImportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/subchapitres/{sub_chapitre_id}/generate-and-import-validation-exercises":{"post":{"tags":["Admin - Holiday Courses"],"summary":"Generate And Import Validation Exercises","description":"Generate exercises from course content using AI and import them automatically.\n\nThis endpoint:\n1. Fetches the combined content of the SubChapitre's course\n2. Uses an LLM (prompt pp-admin-content-to-tex-exercises-01) to generate a LaTeX string containing 9 categorized exercises based on this content\n3. Then, reuses the refactored logic from the existing .tex import feature to parse this AI-generated LaTeX, generate solutions/hints for each exercise, create HolidayCourseExercise documents, and link them to the SubChapitre","operationId":"generate_and_import_validation_exercises_admin_holiday_courses_subchapitres__sub_chapitre_id__generate_and_import_validation_exercises_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_chapitre_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course sub-chapitre","title":"Sub Chapitre Id"},"description":"The ID of the holiday course sub-chapitre"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateAndImportExercisesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-courses/classes/{classe_id}/download-exercises":{"get":{"tags":["Admin - Holiday Courses"],"summary":"Download Classe Exercises","description":"Download all exercises for a holiday course classe as a Markdown file.\n\nThis endpoint aggregates all exercises from all chapters and sub-chapters\nof the specified classe and returns them as a downloadable Markdown file.\n\nArgs:\n    classe_id: The ID of the holiday course classe\n    admin: Current admin user (authentication required)\n    db: Database connection\n\nReturns:\n    StreamingResponse: Markdown file containing all exercises\n\nRaises:\n    HTTPException: If classe not found or other errors occur","operationId":"download_classe_exercises_admin_holiday_courses_classes__classe_id__download_exercises_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"classe_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the holiday course classe","title":"Classe Id"},"description":"The ID of the holiday course classe"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-rollout/report":{"get":{"tags":["Admin - Holiday Rollout"],"summary":"Get Rollout Report","description":"Full rollout report: eligible population, popup/banner funnel, and\nper-student detail of progress in the seasonal cahiers (since the campaign\nstart only — the Terminale→Prépa cahier has pre-existing users from 2025).","operationId":"get_rollout_report_admin_holiday_rollout_report_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"string","description":"Campaign start (YYYY-MM-DD). Progress created before this date is ignored, so last year's cahier users don't pollute the funnel.","default":"2026-07-01","title":"Since"},"description":"Campaign start (YYYY-MM-DD). Progress created before this date is ignored, so last year's cahier users don't pollute the funnel."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolloutReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/holiday-rollout/notify-eligible":{"post":{"tags":["Admin - Holiday Rollout"],"summary":"Notify Eligible Students","description":"Send a mobile push (APNs/FCM) to eligible students who have the app.\n\nStudents already notified for this campaign are always excluded\n(`holiday_rollout_notifications` keeps one marker per student), so the\nendpoint can be re-run safely to catch newly eligible students. Use\ndry_run=true (default) to preview the audience without sending.","operationId":"notify_eligible_students_admin_holiday_rollout_notify_eligible_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotifyEligibleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotifyEligibleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/bug-reports":{"post":{"tags":["Bug Reports"],"summary":"Create Bug Report","operationId":"create_bug_report_bug_reports_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BugReportCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BugReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/bug-reports":{"get":{"tags":["Bug Reports"],"summary":"List Bug Reports","operationId":"list_bug_reports_admin_bug_reports_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["open","resolved"],"type":"string"},{"type":"null"}],"description":"Filter by status; omit for every report","title":"Status"},"description":"Filter by status; omit for every report"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BugReportListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/bug-reports/{report_id}":{"get":{"tags":["Bug Reports"],"summary":"Get Bug Report","operationId":"get_bug_report_admin_bug_reports__report_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the bug report","title":"Report Id"},"description":"The ID of the bug report"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BugReportResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/bug-reports/{report_id}/resolve":{"post":{"tags":["Bug Reports"],"summary":"Resolve Bug Report","operationId":"resolve_bug_report_admin_bug_reports__report_id__resolve_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the bug report","title":"Report Id"},"description":"The ID of the bug report"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BugReportResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/bug-reports/{report_id}/reopen":{"post":{"tags":["Bug Reports"],"summary":"Reopen Bug Report","operationId":"reopen_bug_report_admin_bug_reports__report_id__reopen_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the bug report","title":"Report Id"},"description":"The ID of the bug report"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BugReportResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-courses":{"get":{"tags":["admin","teacher-courses"],"summary":"List Teacher Courses","description":"List all teacher courses with their processing status.\nAdmin only.","operationId":"list_teacher_courses_admin_teacher_courses_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status (UPLOADING, PROCESSING_IMAGES, GENERATING_CONTENT, COMPLETED, FAILED)","title":"Status"},"description":"Filter by status (UPLOADING, PROCESSING_IMAGES, GENERATING_CONTENT, COMPLETED, FAILED)"},{"name":"has_issues","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter courses with issues (empty units, errors, stuck)","title":"Has Issues"},"description":"Filter courses with issues (empty units, errors, stuck)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherCoursesListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-courses/{course_id}":{"get":{"tags":["admin","teacher-courses"],"summary":"Get Teacher Course Detail","description":"Get detailed information about a specific teacher course.\nAdmin only.","operationId":"get_teacher_course_detail_admin_teacher_courses__course_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"include_raw_content","in":"query","required":false,"schema":{"type":"boolean","description":"Include raw content blob","default":false,"title":"Include Raw Content"},"description":"Include raw content blob"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherCourseDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin","teacher-courses"],"summary":"Delete Teacher Course","description":"Delete a teacher course and all related data.\nAdmin only.","operationId":"delete_teacher_course_admin_teacher_courses__course_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-courses/{course_id}/retry-processing":{"post":{"tags":["admin","teacher-courses"],"summary":"Retry Course Processing","description":"Retry processing for a failed or stuck teacher course.\nThis will restart the processing from the raw_content_blob if available,\nor from the original images if not.\n\nAdmin only.","operationId":"retry_course_processing_admin_teacher_courses__course_id__retry_processing_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetryProcessingRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-courses/{course_id}/status":{"patch":{"tags":["admin","teacher-courses"],"summary":"Update Course Status","description":"Manually update the status of a teacher course.\nAdmin only.","operationId":"update_course_status_admin_teacher_courses__course_id__status_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"status","in":"query","required":true,"schema":{"type":"string","title":"Status"}},{"name":"error_message","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/figures":{"get":{"tags":["admin-figures"],"summary":"Get Figures","description":"Get all figures with filtering and pagination.","operationId":"get_figures_admin_figures_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"source_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by source type","title":"Source Type"},"description":"Filter by source type"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by start date (YYYY-MM-DD)","title":"Start Date"},"description":"Filter by start date (YYYY-MM-DD)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by end date (YYYY-MM-DD)","title":"End Date"},"description":"Filter by end date (YYYY-MM-DD)"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by user email","title":"Search"},"description":"Search by user email"},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FiguresListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/correction-monitoring/summary":{"get":{"tags":["Admin Correction Monitoring"],"summary":"Get Correction Monitoring Summary","description":"Get summary statistics for correction modifications in a given month.","operationId":"get_correction_monitoring_summary_admin_correction_monitoring_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":1,"title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionModificationSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/correction-monitoring":{"get":{"tags":["Admin Correction Monitoring"],"summary":"List Correction Modifications","description":"List correction modifications with filters and pagination.","operationId":"list_correction_modifications_admin_correction_monitoring_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":1,"title":"Month"}},{"name":"method","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by modification method","title":"Method"},"description":"Filter by modification method"},{"name":"teacher_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by teacher email","title":"Teacher Email"},"description":"Filter by teacher email"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedModificationList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/correction-monitoring/{event_id}":{"get":{"tags":["Admin Correction Monitoring"],"summary":"Get Correction Modification Detail","description":"Get detailed information about a specific correction modification.","operationId":"get_correction_modification_detail_admin_correction_monitoring__event_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionModificationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/webinars/upcoming-slots":{"get":{"tags":["Teacher - Webinars"],"summary":"Get Upcoming Webinar Slots","description":"Get upcoming active webinar slots that teachers can register for.\n\nReturns slots that are:\n- Active (is_active = True)\n- In the future (start_time_utc > now)\n\nFor each slot, includes:\n- Whether the current teacher is already registered\n- Current registration count\n- Whether the slot is full (if max_attendees is set)","operationId":"get_upcoming_webinar_slots_teacher_webinars_upcoming_slots_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UpcomingWebinarSlotResponse"},"type":"array","title":"Response Get Upcoming Webinar Slots Teacher Webinars Upcoming Slots Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher/webinars/slots/{slot_id}/register":{"post":{"tags":["Teacher - Webinars"],"summary":"Register For Webinar Slot","description":"Register the current teacher for a webinar slot.\n\nThis endpoint will:\n- Validate the slot exists and is active\n- Check if the slot is not full (if max_attendees is set)\n- Check if the slot is not in the past\n- Prevent duplicate registrations\n- Send a confirmation email in French with Paris timezone","operationId":"register_for_webinar_slot_teacher_webinars_slots__slot_id__register_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slot_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the webinar slot to register for","title":"Slot Id"},"description":"The ID of the webinar slot to register for"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/webinars/slots/{slot_id}/unregister":{"delete":{"tags":["Teacher - Webinars"],"summary":"Unregister From Webinar Slot","description":"Unregister the current teacher from a webinar slot.\n\nThis endpoint will:\n- Validate the slot exists\n- Check if the teacher is actually registered\n- Remove the registration\n- Allow unregistration even if the slot has started (for flexibility)","operationId":"unregister_from_webinar_slot_teacher_webinars_slots__slot_id__unregister_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slot_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the webinar slot to unregister from","title":"Slot Id"},"description":"The ID of the webinar slot to unregister from"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chats":{"get":{"tags":["Chats"],"summary":"Get Chats","operationId":"get_chats_chats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ChatSummaryResponse"},"type":"array","title":"Response Get Chats Chats Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Chats"],"summary":"Create Chat","operationId":"create_chat_chats_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ChatCreateRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/chats/hidden":{"get":{"tags":["Chats"],"summary":"Get Hidden Chats","operationId":"get_hidden_chats_chats_hidden_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ChatSummaryResponse"},"type":"array","title":"Response Get Hidden Chats Chats Hidden Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/chats/{chat_id}/title":{"patch":{"tags":["Chats"],"summary":"Rename Chat","operationId":"rename_chat_chats__chat_id__title_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRenameRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__simple_chat__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chats/{chat_id}":{"delete":{"tags":["Chats"],"summary":"Hide Chat","operationId":"hide_chat_chats__chat_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__simple_chat__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chats/{chat_id}/restore":{"post":{"tags":["Chats"],"summary":"Restore Chat","operationId":"restore_chat_chats__chat_id__restore_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__simple_chat__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chats/{chat_id}/messages":{"get":{"tags":["Chats"],"summary":"Get Chat Messages","operationId":"get_chat_messages_chats__chat_id__messages_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatMessagesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Chats"],"summary":"Send Chat Message","operationId":"send_chat_message_chats__chat_id__messages_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatMessageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__simple_chat__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chats/{chat_id}/generate-title":{"post":{"tags":["Chats"],"summary":"Generate Chat Title","operationId":"generate_chat_title_chats__chat_id__generate_title_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatTitleGenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__simple_chat__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chats/{chat_id}/stream":{"get":{"tags":["Chats"],"summary":"Stream Chat Response","operationId":"stream_chat_response_chats__chat_id__stream_get","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}},{"name":"session_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},{"name":"exercise_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Id"}},{"name":"course_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Course Id"}},{"name":"course_route_kind","in":"query","required":false,"schema":{"anyOf":[{"enum":["my_course","assigned_course"],"type":"string"},{"type":"null"}],"title":"Course Route Kind"}},{"name":"cpge_exercise_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cpge Exercise Id"}},{"name":"teacher_exercise_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Exercise Id"}},{"name":"assignment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id"}},{"name":"admin_feedback_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Feedback Id"}},{"name":"copy_correction_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Copy Correction Id"}},{"name":"teacher_exam_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Exam Id"}},{"name":"teacher_exam_exercise_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Teacher Exam Exercise Id"}},{"name":"teacher_course_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Course Id"}},{"name":"teacher_course_unit_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Course Unit Id"}},{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"enum":["maths","physique-chimie"],"type":"string"},{"type":"null"}],"description":"The matière the student is currently in (from the subject selector). Teachers derive it from their own subject. Defaults to maths.","title":"Subject"},"description":"The matière the student is currently in (from the subject selector). Teachers derive it from their own subject. Defaults to maths."},{"name":"request_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},{"name":"attach_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Attach Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chats/{chat_id}/audio":{"post":{"tags":["Chats"],"summary":"Upload Audio","operationId":"upload_audio_chats__chat_id__audio_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__simple_chat__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chats/{chat_id}/reset":{"post":{"tags":["Chats"],"summary":"Reset Chat","operationId":"reset_chat_chats__chat_id__reset_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__simple_chat__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/reprompt-structured":{"put":{"tags":["Teacher Exams Subjects"],"summary":"Reprompt Structured To Structured","description":"Reprompt structured exercises into a new structured format.","operationId":"reprompt_structured_to_structured_teacher_exams__exam_id__subjects_reprompt_structured_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepromptSubjectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reprompt Structured To Structured Teacher Exams  Exam Id  Subjects Reprompt Structured Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/generate-structured-subject":{"post":{"tags":["Teacher Exams Subjects"],"summary":"Generate Structured Subject","description":"Generate a structured exam subject with exercises using teacher input.\nIf direct_accept is True, saves directly as official exercises.\nOtherwise, returns the generated exercises without saving.","operationId":"generate_structured_subject_teacher_exams__exam_id__subjects_generate_structured_subject_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSubjectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Structured Subject Teacher Exams  Exam Id  Subjects Generate Structured Subject Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/{exercise_id}/reprompt":{"put":{"tags":["Teacher Exams Subjects"],"summary":"Reprompt Exercise","description":"Refine a specific exercise by its ID.","operationId":"reprompt_exercise_teacher_exams__exam_id__subjects_exercises__exercise_id__reprompt_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"integer","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepromptExerciseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reprompt Exercise Teacher Exams  Exam Id  Subjects Exercises  Exercise Id  Reprompt Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/chat-action":{"post":{"tags":["Teacher Exams Subjects"],"summary":"Apply Exam Chat Action","description":"Apply one teacher-confirmed chat proposal atomically as a new version.","operationId":"apply_exam_chat_action_teacher_exams__exam_id__subjects_exercises_chat_action_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExamChatActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Apply Exam Chat Action Teacher Exams  Exam Id  Subjects Exercises Chat Action Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/order":{"put":{"tags":["Teacher Exams Subjects"],"summary":"Reorder Exercises","description":"Reorder the exam's structured_exercises to match the given id sequence.\n\nThe request must list every existing exercise id exactly once — partial\nreorderings or unknown ids are rejected so the new version is always a\npure permutation of the previous one (EXC-66).","operationId":"reorder_exercises_teacher_exams__exam_id__subjects_exercises_order_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderExercisesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reorder Exercises Teacher Exams  Exam Id  Subjects Exercises Order Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/{exercise_id}":{"put":{"tags":["Teacher Exams Subjects"],"summary":"Update Exercise","description":"Update an entire exercise with new content.","operationId":"update_exercise_teacher_exams__exam_id__subjects_exercises__exercise_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"integer","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExerciseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Exercise Teacher Exams  Exam Id  Subjects Exercises  Exercise Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Teacher Exams Subjects"],"summary":"Delete Exercise","description":"Delete a specific exercise from a structured exam by its ID.\nThis will also remove the corresponding correction if it exists.","operationId":"delete_exercise_teacher_exams__exam_id__subjects_exercises__exercise_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"integer","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Exercise Teacher Exams  Exam Id  Subjects Exercises  Exercise Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/generate-corrections":{"post":{"tags":["Teacher Exams Subjects"],"summary":"Generate Corrections For Exam","description":"Generate solutions for exercises that don't already have solutions and persist as a new version.","operationId":"generate_corrections_for_exam_teacher_exams__exam_id__subjects_exercises_generate_corrections_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/GenerateCorrectionsRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Corrections For Exam Teacher Exams  Exam Id  Subjects Exercises Generate Corrections Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/structured-accept":{"post":{"tags":["Teacher Exams Subjects"],"summary":"Accept Structured Subject","description":"Accept the provided structured exercises and store them as the official exam exercises.\nCreates a new version with the accepted exercises.","operationId":"accept_structured_subject_teacher_exams__exam_id__subjects_structured_accept_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptStructuredSubjectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Accept Structured Subject Teacher Exams  Exam Id  Subjects Structured Accept Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises":{"get":{"tags":["Teacher Exams Subjects"],"summary":"Get Exam Exercises","description":"Get the current exam's structured exercises from versioned content.","operationId":"get_exam_exercises_teacher_exams__exam_id__subjects_exercises_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Exam Exercises Teacher Exams  Exam Id  Subjects Exercises Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/add":{"post":{"tags":["Teacher Exams Subjects"],"summary":"Add New Exercises","description":"Add new exercises to an existing structured exam.\nThis generates new exercises using the provided parameters and appends them to the existing exercises with new IDs.","operationId":"add_new_exercises_teacher_exams__exam_id__subjects_exercises_add_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddExerciseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add New Exercises Teacher Exams  Exam Id  Subjects Exercises Add Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/add-from-upload":{"post":{"tags":["Teacher Exams Subjects"],"summary":"Add Exercises From Upload","description":"Add new exercises to an existing structured exam from uploaded content.\nThis processes raw LaTeX content using LLM to detect and structure multiple exercises.","operationId":"add_exercises_from_upload_teacher_exams__exam_id__subjects_exercises_add_from_upload_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddExercisesFromUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Exercises From Upload Teacher Exams  Exam Id  Subjects Exercises Add From Upload Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/add-from-excellence":{"post":{"tags":["Teacher Exams Subjects"],"summary":"Add Exercises From Excellence","description":"Add new exercises to an existing structured exam from Excellence exercise database.\nThis copies the content from selected Excellence exercises and adds them to the exam.","operationId":"add_exercises_from_excellence_teacher_exams__exam_id__subjects_exercises_add_from_excellence_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddExercisesFromExcellenceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Exercises From Excellence Teacher Exams  Exam Id  Subjects Exercises Add From Excellence Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/add-from-annales":{"post":{"tags":["Teacher Exams Subjects"],"summary":"Add Exercises From Annales","description":"Add exercises from annales (French exam archives) to an existing structured exam.\nConverts Markdown+LaTeX content to HTML with inline images.","operationId":"add_exercises_from_annales_teacher_exams__exam_id__subjects_exercises_add_from_annales_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddExercisesFromAnnalesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Exercises From Annales Teacher Exams  Exam Id  Subjects Exercises Add From Annales Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/import-teacher-exercises":{"post":{"tags":["Teacher Exams Subjects"],"summary":"Import Teacher Exercises To Exam","description":"Import exercises from teacher's exercise library to an exam.\nThis copies the content and solution from selected teacher exercises.","operationId":"import_teacher_exercises_to_exam_teacher_exams__exam_id__subjects_exercises_import_teacher_exercises_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportTeacherExercisesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Import Teacher Exercises To Exam Teacher Exams  Exam Id  Subjects Exercises Import Teacher Exercises Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/{exercise_id}/title":{"put":{"tags":["Teacher Exams Subjects"],"summary":"Update Exercise Title","description":"Update the title of a specific exercise in both official and draft exercises.","operationId":"update_exercise_title_teacher_exams__exam_id__subjects_exercises__exercise_id__title_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"integer","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExerciseTitleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Exercise Title Teacher Exams  Exam Id  Subjects Exercises  Exercise Id  Title Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/{exercise_id}/points":{"put":{"tags":["Teacher Exams Subjects"],"summary":"Update Exercise Points","description":"Update the points of a specific exercise in both official and draft exercises.","operationId":"update_exercise_points_teacher_exams__exam_id__subjects_exercises__exercise_id__points_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"integer","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExercisePointsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Exercise Points Teacher Exams  Exam Id  Subjects Exercises  Exercise Id  Points Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/{exercise_id}/edit-latex-content":{"put":{"tags":["Teacher Exams Subjects"],"summary":"Update Exercise Latex Content","description":"Update exercise content directly.","operationId":"update_exercise_latex_content_teacher_exams__exam_id__subjects_exercises__exercise_id__edit_latex_content_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"integer","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__teacher_exams__subjects__UpdateExerciseLatexContentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Exercise Latex Content Teacher Exams  Exam Id  Subjects Exercises  Exercise Id  Edit Latex Content Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/{exercise_id}/reprompt-solution":{"put":{"tags":["Teacher Exams Subjects"],"summary":"Reprompt Exercise Solution","description":"Refine a specific exercise's solution by its ID.","operationId":"reprompt_exercise_solution_teacher_exams__exam_id__subjects_exercises__exercise_id__reprompt_solution_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"integer","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepromptExerciseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reprompt Exercise Solution Teacher Exams  Exam Id  Subjects Exercises  Exercise Id  Reprompt Solution Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/{exercise_id}/split":{"post":{"tags":["Teacher Exams Subjects"],"summary":"Split Exam Exercise","description":"Split an exam exercise into multiple exercises using AI.","operationId":"split_exam_exercise_teacher_exams__exam_id__subjects_exercises__exercise_id__split_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"integer","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SplitExamExerciseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Split Exam Exercise Teacher Exams  Exam Id  Subjects Exercises  Exercise Id  Split Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/{exercise_id}/generate-similar":{"post":{"tags":["Teacher Exams Subjects"],"summary":"Generate Similar Exam Exercise","description":"Generate a similar exercise based on an existing exam exercise using AI.","operationId":"generate_similar_exam_exercise_teacher_exams__exam_id__subjects_exercises__exercise_id__generate_similar_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"integer","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSimilarExamExerciseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Similar Exam Exercise Teacher Exams  Exam Id  Subjects Exercises  Exercise Id  Generate Similar Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/subjects/exercises/{exercise_id}/edit-latex-solution":{"put":{"tags":["Teacher Exams Subjects"],"summary":"Update Exercise Solution Latex Content","description":"Update exercise solution content directly (legacy LaTeX edit alias).","operationId":"update_exercise_solution_latex_content_teacher_exams__exam_id__subjects_exercises__exercise_id__edit_latex_solution_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"integer","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExerciseSolutionLatexContentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Exercise Solution Latex Content Teacher Exams  Exam Id  Subjects Exercises  Exercise Id  Edit Latex Solution Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/transcripts/subject":{"put":{"tags":["Teacher Exams Transcripts"],"summary":"Update Subject Transcript","description":"Update the exam subject transcript by converting it to structured exercises.","operationId":"update_subject_transcript_teacher_exams__exam_id__transcripts_subject_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__teacher_exams__transcripts__TranscriptRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Subject Transcript Teacher Exams  Exam Id  Transcripts Subject Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/transcripts/correction":{"put":{"tags":["Teacher Exams Transcripts"],"summary":"Update Correction Transcript","description":"Update the exam correction transcript by converting it to structured corrections if structured exercises exist.","operationId":"update_correction_transcript_teacher_exams__exam_id__transcripts_correction_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__teacher_exams__transcripts__TranscriptRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Correction Transcript Teacher Exams  Exam Id  Transcripts Correction Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/latex":{"post":{"tags":["Teacher Exams LaTeX"],"summary":"Generate Latex Subject","description":"Generate a LaTeX document, compiled PDF, or DOCX from exam content.\nFor structured_corrections, uses template-based approach instead of LLM and applies PDF formatting options.","operationId":"generate_latex_subject_teacher_exams__exam_id__latex_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateLatexOptions"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Latex Subject Teacher Exams  Exam Id  Latex Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/latex/pdf-options":{"get":{"tags":["Teacher Exams LaTeX"],"summary":"Get Exam Pdf Options","description":"Get PDF formatting options for a specific exam.","operationId":"get_exam_pdf_options_teacher_exams__exam_id__latex_pdf_options_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Teacher Exams LaTeX"],"summary":"Update Exam Pdf Options","description":"Update PDF formatting options for a specific exam and automatically save as teacher preferences.\n\nNote: Teacher global preferences are only updated if the teacher is the actual owner of the exam,\nnot when accessing a shared exam. This prevents contamination of personal preferences with shared exam settings.\n\nA finished school year does not close this one: the layout describes the\nprintout the teacher is making today, not what the class was given that\nyear. The sujet, the corrigé, the titre and the niveau stay frozen.","operationId":"update_exam_pdf_options_teacher_exams__exam_id__latex_pdf_options_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PDFOptionsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/latex/teacher-preferences":{"get":{"tags":["Teacher Exams LaTeX"],"summary":"Get Teacher Pdf Preferences","description":"Get teacher's default PDF formatting preferences.","operationId":"get_teacher_pdf_preferences_teacher_exams__exam_id__latex_teacher_preferences_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["Teacher Exams LaTeX"],"summary":"Update Teacher Pdf Preferences","description":"Update teacher's default PDF formatting preferences.","operationId":"update_teacher_pdf_preferences_teacher_exams__exam_id__latex_teacher_preferences_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherPDFPreferencesUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher-exams/latex/teacher-preferences":{"get":{"tags":["Teacher Exams LaTeX Global"],"summary":"Get Teacher Pdf Preferences Global","description":"Get teacher's default PDF formatting preferences (global route).","operationId":"get_teacher_pdf_preferences_global_teacher_exams_latex_teacher_preferences_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["Teacher Exams LaTeX Global"],"summary":"Update Teacher Pdf Preferences Global","description":"Update teacher's default PDF formatting preferences (global route).","operationId":"update_teacher_pdf_preferences_global_teacher_exams_latex_teacher_preferences_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherPDFPreferencesUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher-exams/root":{"get":{"tags":["Teacher Exams Sharing"],"summary":"Get Shared Root","description":"Get ALL teacher exams (owned + shared) with sharing status tags for root view.\nIncludes exam titles from teacher_exam_content collection.","operationId":"get_shared_root_teacher_exams_root_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/share":{"post":{"tags":["Teacher Exams Sharing"],"summary":"Share Exam","description":"Share a teacher exam with proper permission checks.\n\nUsers can share if:\n- They own the exam directly, OR\n- They have write access through folder inheritance","operationId":"share_exam_teacher_exams__exam_id__share_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareExamRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareExamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/sharing":{"put":{"tags":["Teacher Exams Sharing"],"summary":"Update Exam Sharing","description":"Update sharing options for a teacher exam with proper permission checks.\n\nUsers can update sharing if:\n- They own the exam directly, OR\n- They have write access through folder inheritance","operationId":"update_exam_sharing_teacher_exams__exam_id__sharing_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSharingRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareExamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/school-teachers":{"get":{"tags":["Teacher Exams Sharing"],"summary":"Get School Teachers","description":"Get all teachers from the same school as the current user.","operationId":"get_school_teachers_teacher_exams_school_teachers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__teacher_exams__sharing__SchoolTeachersResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher-exams/{exam_id}/check-edit-permission":{"post":{"tags":["Teacher Exams Sharing"],"summary":"Check Edit Permission","description":"Check if the current user can edit the specified exam using centralized sharing service.","operationId":"check_edit_permission_teacher_exams__exam_id__check_edit_permission_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/versions":{"get":{"tags":["Teacher Exam Versions"],"summary":"Get Exam Versions","description":"Get all versions of an exam with author names populated.\nRequires read access to the exam.","operationId":"get_exam_versions_teacher_exams__exam_id__versions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExamVersionsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/versions/{content_id}/make-current":{"post":{"tags":["Teacher Exam Versions"],"summary":"Set Current Version","description":"Set a specific version as the current version.\nRequires write access to the exam.","operationId":"set_current_version_teacher_exams__exam_id__versions__content_id__make_current_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Current Version Teacher Exams  Exam Id  Versions  Content Id  Make Current Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/variants":{"post":{"tags":["Teacher Exam Variants"],"summary":"Start Exam Variant","operationId":"start_exam_variant_teacher_exams__exam_id__variants_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExamVariantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExamVariantJobResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/variants/latest":{"get":{"tags":["Teacher Exam Variants"],"summary":"Get Latest Exam Variant","operationId":"get_latest_exam_variant_teacher_exams__exam_id__variants_latest_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExamVariantJobResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/variants/{job_id}":{"get":{"tags":["Teacher Exam Variants"],"summary":"Get Exam Variant","operationId":"get_exam_variant_teacher_exams__exam_id__variants__job_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExamVariantJobResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/variants/{job_id}/accept":{"post":{"tags":["Teacher Exam Variants"],"summary":"Accept Exam Variant","description":"Create a new exam from the finished job. Figures flagged `keep` are\nshared with the source exam (same as duplicate); `adapt` figures are\nredrawn from the model's description with the source code as a hint.","operationId":"accept_exam_variant_teacher_exams__exam_id__variants__job_id__accept_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExamVariantAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExamVariantAcceptResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Business rule violated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/start-grading":{"post":{"tags":["Copy Correction"],"summary":"Start Grading","description":"Trigger AI grading for all pending student copies.","operationId":"start_grading_copy_correction__session_id__start_grading_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/retry-failed":{"post":{"tags":["Copy Correction"],"summary":"Retry Failed Grading","description":"Reset error copies to pending and re-launch grading for them.","operationId":"retry_failed_grading_copy_correction__session_id__retry_failed_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/grading-status":{"get":{"tags":["Copy Correction"],"summary":"Get Grading Status","description":"Poll grading progress.","operationId":"get_grading_status_copy_correction__session_id__grading_status_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/students/{copy_id}/grades":{"put":{"tags":["Copy Correction"],"summary":"Update Student Grades","description":"Update grades for a specific student copy (teacher review edits).","operationId":"update_student_grades_copy_correction__session_id__students__copy_id__grades_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"copy_id","in":"path","required":true,"schema":{"type":"string","title":"Copy Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGradeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/reset-corrections":{"post":{"tags":["Copy Correction"],"summary":"Reset Corrections","description":"Reset all corrections: archive grades, clear copy grades, reset processing status.","operationId":"reset_corrections_copy_correction__session_id__reset_corrections_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/students/{copy_id}/status":{"put":{"tags":["Copy Correction"],"summary":"Update Student Status","description":"Mark a student copy as reviewed.","operationId":"update_student_status_copy_correction__session_id__students__copy_id__status_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"copy_id","in":"path","required":true,"schema":{"type":"string","title":"Copy Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStatusBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/acquisition-mode":{"put":{"tags":["Copy Correction"],"summary":"Set Acquisition Mode","description":"Set the acquisition mode for this correction session.","operationId":"set_acquisition_mode_copy_correction__session_id__acquisition_mode_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcquisitionModeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/acquisition-status":{"put":{"tags":["Copy Correction"],"summary":"Set Acquisition Status","description":"Start or stop student acquisition for this correction session.","operationId":"set_acquisition_status_copy_correction__session_id__acquisition_status_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcquisitionStatusBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/student/pending-acquisitions":{"get":{"tags":["Copy Correction"],"summary":"Get Pending Acquisitions","description":"Get open acquisition sessions for the student's classes.","operationId":"get_pending_acquisitions_copy_correction_student_pending_acquisitions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PendingAcquisition"},"type":"array","title":"Response Get Pending Acquisitions Copy Correction Student Pending Acquisitions Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/copy-correction/student/acquisition/{session_id}":{"get":{"tags":["Copy Correction"],"summary":"Get Student Submission","description":"Get the student's current submission state for a session.","operationId":"get_student_submission_copy_correction_student_acquisition__session_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/student/acquisition/{session_id}/upload-photo":{"post":{"tags":["Copy Correction"],"summary":"Upload Student Photo","description":"Student uploads a photo (already uploaded to S3 via /image/upload).\n\nUses atomic ``$push`` + ``find_one_and_update`` so concurrent uploads\nfrom different students can't clobber each other's writes (the previous\nread-modify-write pattern lost ~30% of photos under load).","operationId":"upload_student_photo_copy_correction_student_acquisition__session_id__upload_photo_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadPhotoBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/student/acquisition/{session_id}/photo":{"delete":{"tags":["Copy Correction"],"summary":"Delete Student Photo","description":"Student deletes one of their photos.","operationId":"delete_student_photo_copy_correction_student_acquisition__session_id__photo_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletePhotoBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/student/acquisition/{session_id}/submit":{"post":{"tags":["Copy Correction"],"summary":"Submit Student Copy","description":"Finalize a student's copy submission.\n\nReorders the student's pages to match ``ordered_image_urls`` and locks\nthe copy so no further uploads or deletions are possible. This action\nis irreversible.","operationId":"submit_student_copy_copy_correction_student_acquisition__session_id__submit_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitCopyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/student/has-results":{"get":{"tags":["Copy Correction"],"summary":"Has Results","description":"Check if the student has at least one evaluation to show.\n\nThis is true if there is any open student-submission acquisition for\nthe student's classes, or if any correction session exists where this\nstudent has uploaded / submitted / been graded.","operationId":"has_results_copy_correction_student_has_results_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/copy-correction/student/results":{"get":{"tags":["Copy Correction"],"summary":"Get Student Results","description":"Return the unified list of evaluations for this student.\n\nIncludes:\n- Open acquisitions where the student has not yet submitted a copy\n  (state = \"not_submitted\").\n- Sessions where the student has submitted their copy or been graded\n  but results are not yet published (state = \"submitted_pending\").\n- Sessions with published results (state = \"graded\").","operationId":"get_student_results_copy_correction_student_results_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/copy-correction/student/results/{session_id}":{"get":{"tags":["Copy Correction"],"summary":"Get Student Result Detail","description":"Get detailed results for a specific evaluation.","operationId":"get_student_result_detail_copy_correction_student_results__session_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/student/results/{session_id}/generate-remediation":{"post":{"tags":["Copy Correction"],"summary":"Generate Copy Remediation","description":"Generate a remediation session based on the student's copy correction results.","operationId":"generate_copy_remediation_copy_correction_student_results__session_id__generate_remediation_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/results":{"get":{"tags":["Copy Correction"],"summary":"Get Results","description":"Get aggregated results for a correction session.","operationId":"get_results_copy_correction__session_id__results_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/publish-results":{"put":{"tags":["Copy Correction"],"summary":"Publish Results","description":"Publish results to students. Auto-marks unreviewed copies as reviewed.","operationId":"publish_results_copy_correction__session_id__publish_results_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PublishResultsRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/grades-visibility":{"put":{"tags":["Copy Correction"],"summary":"Set Grades Visibility","description":"Flip `grades_hidden` on an already-published session.\n\nDeliberately separate from publish-results: publishing notifies the\nstudents, this toggle must never re-notify them.","operationId":"set_grades_visibility_copy_correction__session_id__grades_visibility_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GradesVisibilityRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/unpublish-results":{"put":{"tags":["Copy Correction"],"summary":"Unpublish Results","description":"Unpublish results, hiding them from students.","operationId":"unpublish_results_copy_correction__session_id__unpublish_results_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/edit-stats":{"get":{"tags":["Copy Correction"],"summary":"Get Edit Stats","description":"Return statistics about teacher edits vs AI results.","operationId":"get_edit_stats_copy_correction__session_id__edit_stats_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/upload-pdf":{"post":{"tags":["Copy Correction"],"summary":"Upload Pdf","description":"Upload a PDF or image file and process it in the background.\n\nStreams the file to a temp file (never loads the full file into RAM),\nthen kicks off a background task that converts pages one-by-one.\nThe frontend polls GET /{session_id}/pdf-upload-status for progress.\n\n`upload_mode` is per-upload, NOT per-session. A teacher can mix simple\nand copies-doubles uploads in the same session — each upload carries its\nown mode, and \"copie_double\" triggers a smart-split that only processes\nthe pages from THIS batch (the smart-split background task receives the\n`start_index` of the first new page).","operationId":"upload_pdf_copy_correction__session_id__upload_pdf_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_pdf_copy_correction__session_id__upload_pdf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/pdf-upload-status":{"get":{"tags":["Copy Correction"],"summary":"Get Pdf Upload Status","description":"Poll the PDF upload/processing progress.\n\nIncludes smart_split_* fields so the frontend can show the post-upload\n\"splitting/analyzing/reordering\" stages for copies doubles.","operationId":"get_pdf_upload_status_copy_correction__session_id__pdf_upload_status_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/soft-delete-page":{"put":{"tags":["Copy Correction"],"summary":"Soft Delete Page","description":"Soft-delete a page by adding its index to deleted_pages.","operationId":"soft_delete_page_copy_correction__session_id__soft_delete_page_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SoftDeletePageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/students/{copy_id}/reorder-pages":{"put":{"tags":["Copy Correction"],"summary":"Reorder Student Pages","description":"Reorder the pages of one student's copy (post-correction review).","operationId":"reorder_student_pages_copy_correction__session_id__students__copy_id__reorder_pages_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"copy_id","in":"path","required":true,"schema":{"type":"string","title":"Copy Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderPagesBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/rotate-page":{"put":{"tags":["Copy Correction"],"summary":"Rotate Page","description":"Rotate a page image by 90° and keep grading overlays aligned.\n\nThe rotated image is re-rendered server-side and swapped into\nall_page_images so every consumer (review, student view, exports) sees\nthe corrected orientation.","operationId":"rotate_page_copy_correction__session_id__rotate_page_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotatePageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/auto-assign":{"post":{"tags":["Copy Correction"],"summary":"Auto Assign","description":"Use AI to automatically detect student boundaries and assign pages.","operationId":"auto_assign_copy_correction__session_id__auto_assign_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoAssignBody","default":{"exclude_pages":[]}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/class":{"put":{"tags":["Copy Correction"],"summary":"Set Class","description":"Set the class for this correction session.","operationId":"set_class_copy_correction__session_id__class_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetClassBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/assign-pages":{"put":{"tags":["Copy Correction"],"summary":"Assign Pages","description":"Assign PDF pages to students.","operationId":"assign_pages_copy_correction__session_id__assign_pages_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignPagesBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/add-missing-copy":{"post":{"tags":["Copy Correction"],"summary":"Add Missing Copy","description":"Upload a copy for a missing student, assign it, and trigger grading.\n\nAccepts one or more files (PDF or images).  A new StudentCopy is created\nimmediately with status ``pending``.  A background task processes the files,\nassigns pages, and grades the copy without touching existing corrections.","operationId":"add_missing_copy_copy_correction__session_id__add_missing_copy_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_add_missing_copy_copy_correction__session_id__add_missing_copy_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction":{"post":{"tags":["Copy Correction"],"summary":"Create Session","description":"Create a new correction session from an exam_id.","operationId":"create_session_copy_correction_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSessionBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/copy-correction/by-exam/{exam_id}":{"get":{"tags":["Copy Correction"],"summary":"Get Session By Exam","description":"Get session for a given exam. Admins may pass teacher_id to disambiguate\nwhen multiple teachers share the same exam template.","operationId":"get_session_by_exam_copy_correction_by_exam__exam_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}},{"name":"teacher_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}":{"get":{"tags":["Copy Correction"],"summary":"Get Session","description":"Get a session by ID. Verify teacher owns it (admins can view any).","operationId":"get_session_copy_correction__session_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Copy Correction"],"summary":"Delete Session","description":"Delete a session. Verify teacher owns it (admins can delete any).","operationId":"delete_session_copy_correction__session_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/generate-rubric":{"post":{"tags":["Copy Correction"],"summary":"Generate Rubric","description":"Trigger AI rubric generation. Returns immediately.","operationId":"generate_rubric_copy_correction__session_id__generate_rubric_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/rubric-status":{"get":{"tags":["Copy Correction"],"summary":"Get Rubric Status","description":"Poll rubric generation status.","operationId":"get_rubric_status_copy_correction__session_id__rubric_status_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/rubric":{"put":{"tags":["Copy Correction"],"summary":"Update Rubric","description":"Save the rubric (full replace). Creates a snapshot if the rubric changed.","operationId":"update_rubric_copy_correction__session_id__rubric_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RubricExercise"},"title":"Rubric"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/global-requirements":{"put":{"tags":["Copy Correction"],"summary":"Update Global Requirements","description":"Save the teacher's global correction requirements (full replace).","operationId":"update_global_requirements_copy_correction__session_id__global_requirements_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GlobalRequirement"},"title":"Requirements"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/rubric-history":{"get":{"tags":["Copy Correction"],"summary":"Get Rubric History","description":"List all rubric snapshots for a session (most recent first).","operationId":"get_rubric_history_copy_correction__session_id__rubric_history_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/rubric-history/{snapshot_id}/restore":{"post":{"tags":["Copy Correction"],"summary":"Restore Rubric Snapshot","description":"Restore a rubric snapshot as the current rubric.\n\nAlso creates a snapshot of the current rubric before overwriting it.","operationId":"restore_rubric_snapshot_copy_correction__session_id__rubric_history__snapshot_id__restore_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"snapshot_id","in":"path","required":true,"schema":{"type":"string","title":"Snapshot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/download-rubric-pdf":{"post":{"tags":["Copy Correction"],"summary":"Download Rubric Pdf","description":"Generate and return a PDF with énoncé, correction, and rubric for each exercise.","operationId":"download_rubric_pdf_copy_correction__session_id__download_rubric_pdf_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/reports":{"post":{"tags":["Copy Correction Reports"],"summary":"Create Report","description":"Student flags a comment on their graded copy.","operationId":"create_report_copy_correction__session_id__reports_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReportPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Copy Correction Reports"],"summary":"List Session Reports","description":"Teacher lists all reports for their correction session.","operationId":"list_session_reports_copy_correction__session_id__reports_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportResponse"},"title":"Response List Session Reports Copy Correction  Session Id  Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/reports/mine":{"get":{"tags":["Copy Correction Reports"],"summary":"List My Reports","description":"Student lists their own reports on a given session (to render state).","operationId":"list_my_reports_copy_correction__session_id__reports_mine_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/reports/count":{"get":{"tags":["Copy Correction Reports"],"summary":"Count Pending Reports","description":"Cheap endpoint for the results-tab badge.","operationId":"count_pending_reports_copy_correction__session_id__reports_count_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/copy-correction/{session_id}/reports/{report_id}/resolve":{"put":{"tags":["Copy Correction Reports"],"summary":"Resolve Report","description":"Teacher marks a report as resolved or dismissed.","operationId":"resolve_report_copy_correction__session_id__reports__report_id__resolve_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveReportPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams":{"get":{"tags":["Teacher Exams"],"summary":"List Teacher Exams","description":"Get all exams accessible to the current teacher, optionally filtered by folder.","operationId":"list_teacher_exams_teacher_exams_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExamsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Teacher Exams"],"summary":"Create Teacher Exam","description":"Create a new exam for the current teacher.","operationId":"create_teacher_exam_teacher_exams_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTeacherExamRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTeacherExamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}":{"get":{"tags":["Teacher Exams"],"summary":"Get Teacher Exam","description":"Retrieve a specific exam by its ID, checking both ownership and sharing permissions.","operationId":"get_teacher_exam_teacher_exams__exam_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Teacher Exam Teacher Exams  Exam Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Teacher Exams"],"summary":"Delete Exam","description":"Delete a teacher exam with proper permission checks.\n\nUsers can delete if:\n- They own the exam directly, OR\n- They have write access through folder inheritance","operationId":"delete_exam_teacher_exams__exam_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Exam Teacher Exams  Exam Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/instructions":{"put":{"tags":["Teacher Exams"],"summary":"Update Exam Instructions","description":"Update the custom grading instructions for an exam.","operationId":"update_exam_instructions_teacher_exams__exam_id__instructions_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInstructionsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Exam Instructions Teacher Exams  Exam Id  Instructions Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/title":{"put":{"tags":["Teacher Exams"],"summary":"Update Exam Title","description":"Update the title of an exam by creating a new version.","operationId":"update_exam_title_teacher_exams__exam_id__title_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExamTitleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Exam Title Teacher Exams  Exam Id  Title Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/grade":{"put":{"tags":["Teacher Exams"],"summary":"Update Exam Grade","operationId":"update_exam_grade_teacher_exams__exam_id__grade_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExamGradeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Exam Grade Teacher Exams  Exam Id  Grade Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/move":{"put":{"tags":["Teacher Exams"],"summary":"Move Exam To Folder","description":"Move exam to a different folder with proper permission checks.\n\nUsers can move if:\n- They own the exam directly, OR\n- They have write access through folder inheritance","operationId":"move_exam_to_folder_teacher_exams__exam_id__move_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveExamToFolderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Move Exam To Folder Teacher Exams  Exam Id  Move Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exams/{exam_id}/duplicate":{"post":{"tags":["Teacher Exams"],"summary":"Duplicate Exam","description":"Duplicate a teacher exam.","operationId":"duplicate_exam_teacher_exams__exam_id__duplicate_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTeacherExamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/page-visit":{"post":{"tags":["users"],"summary":"Check Page Visit","description":"Check if this is the user's first visit to a specific page,\nand mark it as visited if it's the first time.","operationId":"check_page_visit_users_page_visit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageVisitRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageVisitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/users/tutorial-completed":{"post":{"tags":["users"],"summary":"Mark Tutorial Completed","operationId":"mark_tutorial_completed_users_tutorial_completed_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mark Tutorial Completed Users Tutorial Completed Post"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/users/tutorials/{tutorial_key}/completed":{"post":{"tags":["users"],"summary":"Mark Location Tutorial Completed","operationId":"mark_location_tutorial_completed_users_tutorials__tutorial_key__completed_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tutorial_key","in":"path","required":true,"schema":{"enum":["home","teacher_exam_level","teacher_exercise_level"],"type":"string","title":"Tutorial Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mark Location Tutorial Completed Users Tutorials  Tutorial Key  Completed Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/inbox/opened":{"post":{"tags":["users"],"summary":"Mark Inbox Opened","operationId":"mark_inbox_opened_users_inbox_opened_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxOpenedResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/users/chat-redesign-home-tour/claim":{"post":{"tags":["users"],"summary":"Claim Chat Redesign Home Tour","operationId":"claim_chat_redesign_home_tour_users_chat_redesign_home_tour_claim_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRedesignHomeTourClaimResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/users/mobile-toolbar-redesign-home-tour/claim":{"post":{"tags":["users"],"summary":"Claim Mobile Toolbar Redesign Home Tour","operationId":"claim_mobile_toolbar_redesign_home_tour_users_mobile_toolbar_redesign_home_tour_claim_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileToolbarRedesignHomeTourClaimResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/users/mobile-toolbar-redesign-home-tour/seen":{"post":{"tags":["users"],"summary":"Mark Mobile Toolbar Redesign Home Tour Seen","operationId":"mark_mobile_toolbar_redesign_home_tour_seen_users_mobile_toolbar_redesign_home_tour_seen_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileToolbarRedesignHomeTourSeenResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/users/mobile-toolbar-redesign-events/chat-opened":{"post":{"tags":["users"],"summary":"Track Mobile Toolbar Redesign Chat Opened","operationId":"track_mobile_toolbar_redesign_chat_opened_users_mobile_toolbar_redesign_events_chat_opened_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileToolbarRedesignChatOpenedRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileToolbarRedesignChatOpenedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/users/me":{"get":{"tags":["users"],"summary":"Get Current User Info","operationId":"get_current_user_info_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/referral/generate":{"get":{"tags":["Referral"],"summary":"Generate Referral Link","description":"Generate a referral link for the current user.\n\nThe referral link is created by encoding the user's ID into a URL-safe referral code,\nthen appended as a query parameter to the frontend registration URL.\n\nReturns:\n    ReferralLinkResponse: A Pydantic model containing the referral link.","operationId":"generate_referral_link_referral_generate_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralLinkResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/referral/all":{"get":{"tags":["Referral"],"summary":"Get Referrals","description":"Fetch all referral summaries for the current user.\n\nThis endpoint queries the referrals collection for documents where the\nreferrer_id matches the current user's ID. For each referral, it looks up the\nreferred user's email using the referred_id, and returns a list of summaries\ncontaining the referred email and the referral status.\n\nReturns:\n    List[ReferralSummary]: A list of referral summary objects.","operationId":"get_referrals_referral_all_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ReferralSummary"},"type":"array","title":"Response Get Referrals Referral All Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/presence/flag":{"post":{"tags":["presence"],"summary":"Flag Presence","description":"Flag the student as having lost focus.\n\nThis endpoint is triggered when a student's exam page loses focus.\nIt creates or updates a document in the 'presence' collection using the\nPresence model to flag the student.","operationId":"flag_presence_presence_flag_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlagResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/presence/status":{"get":{"tags":["presence"],"summary":"Get Presence Status","description":"Retrieve the presence status for all students assigned to the mentor.\n\nThe mentor is authenticated via the JWT. For each assigned student,\nboth the student's ID and full name are returned along with a status:\n\"red\" if a presence flag exists and \"green\" otherwise.","operationId":"get_presence_status_presence_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PresenceStatus"},"type":"array","title":"Response Get Presence Status Presence Status Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/presence/reset":{"post":{"tags":["presence"],"summary":"Reset Presence","description":"Reset the presence flags for all students assigned to the mentor.\n\nThe mentor is authenticated via JWT. This endpoint clears the presence flags\nfrom the 'presence' collection for the mentor’s assigned students.","operationId":"reset_presence_presence_reset_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/stanislas":{"get":{"tags":["stanislas"],"summary":"Get Stanislas Data","description":"GET /stanislas\n\n1. Sets did_the_stanislas_demo = True on the user's record.\n2. Returns the Stanislas doc (creating it if it doesn't exist).","operationId":"get_stanislas_data_stanislas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StanislasOutput"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["stanislas"],"summary":"Add Stanislas Images","description":"POST /stanislas\n\nAppends the given image URLs to the user's Stanislas doc.\nReturns the updated doc.","operationId":"add_stanislas_images_stanislas_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StanislasInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StanislasOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/stanislas/teacher/did-demo":{"get":{"tags":["stanislas"],"summary":"Get Stanislas Demo Users","operationId":"get_stanislas_demo_users_stanislas_teacher_did_demo_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/StanislasDemoUserOutput"},"type":"array","title":"Response Get Stanislas Demo Users Stanislas Teacher Did Demo Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/stanislas/teacher/image":{"delete":{"tags":["stanislas"],"summary":"Delete Stanislas Image","description":"DELETE /stanislas/teacher/image\n\nRemoves a single image from the user's Stanislas doc.\nReturns the updated Stanislas doc.","operationId":"delete_stanislas_image_stanislas_teacher_image_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"image_url","in":"query","required":true,"schema":{"type":"string","title":"Image Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StanislasOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams":{"get":{"tags":["student-exams"],"summary":"List Student Exams","description":"List all student exams created by the logged-in user (student).\nOnly returns exams that have structured exercises (i.e., have content).","operationId":"list_student_exams_student_exams_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStudentExamsResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["student-exams"],"summary":"Create Student Exam","description":"Create a new \"student exam\" with a title and time limit.\nThe exam isn't started yet. The user can upload/generate the subject next.","operationId":"create_student_exam_student_exams_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStudentExamRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStudentExamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student-exams/{exam_id}":{"get":{"tags":["student-exams"],"summary":"Get Student Exam","description":"Get a single StudentExam by ID, only if it belongs to the current user.","operationId":"get_student_exam_student_exams__exam_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStudentExamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["student-exams"],"summary":"Delete Student Exam","description":"Delete a student exam by ID, only if it belongs to the current user.\nAlso removes any associated files if they exist.","operationId":"delete_student_exam_student_exams__exam_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/update-details":{"post":{"tags":["student-exams"],"summary":"Update Exam Details","description":"Update basic exam details like title and time limit.","operationId":"update_exam_details_student_exams__exam_id__update_details_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExamDetailsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/generate-subject":{"post":{"tags":["student-exams"],"summary":"Generate Subject","description":"Use an LLM to generate an exam subject (HTML+LaTeX), stored in `exam_subject_transcribed`.\nAlso optionally updates exam title and time limit.","operationId":"generate_subject_student_exams__exam_id__generate_subject_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSubjectWithDetailsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStudentExamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/upload-subject":{"post":{"tags":["student-exams"],"summary":"Upload Exam Subject","description":"Upload one or more images containing the exam subject.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_exam_subject_student_exams__exam_id__upload_subject_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/start-exam":{"post":{"tags":["student-exams"],"summary":"Start Student Exam","description":"The user indicates they've read the subject and are starting the timed exam.\nWe'll store the start time.","operationId":"start_student_exam_student_exams__exam_id__start_exam_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/upload-work":{"post":{"tags":["student-exams"],"summary":"Upload Student Work","description":"The student can upload images of their own answers while the exam is ongoing.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_student_work_student_exams__exam_id__upload_work_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilesUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/finish":{"post":{"tags":["student-exams"],"summary":"Finish Student Exam","description":"The student finishes the exam. We calculate the total time spent (if started_at is set).","operationId":"finish_student_exam_student_exams__exam_id__finish_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/generate-correction":{"post":{"tags":["student-exams"],"summary":"Generate Exam Correction","description":"Generate an official correction for the exam using LLM.\nStore it in `correction_transcribed`.","operationId":"generate_exam_correction_student_exams__exam_id__generate_correction_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateFeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/generate-feedback":{"post":{"tags":["student-exams"],"summary":"Generate Exam Feedback","description":"Generate feedback and performance metrics for the student's work using LLM.\nUses structured exercises and corrections when available, falls back to unstructured content.","operationId":"generate_exam_feedback_student_exams__exam_id__generate_feedback_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateFeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/set-subject-transcript":{"post":{"tags":["student-exams"],"summary":"Set Student Exam Subject Transcript","description":"Set the transcribed text of the exam subject and convert it to structured exercises.\nThis functions similarly to the teacher exam import functionality.","operationId":"set_student_exam_subject_transcript_student_exams__exam_id__set_subject_transcript_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__student_exams__TranscriptRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStudentExamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/set-work-transcript":{"post":{"tags":["student-exams"],"summary":"Set Student Exam Work Transcript","description":"Set the transcribed text of the student's work.","operationId":"set_student_exam_work_transcript_student_exams__exam_id__set_work_transcript_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__student_exams__TranscriptRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/set-work-images":{"post":{"tags":["student-exams"],"summary":"Set Student Exam Work Images","description":"Set the images of the student's work.","operationId":"set_student_exam_work_images_student_exams__exam_id__set_work_images_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImagesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/set-work-diagrams":{"post":{"tags":["student-exams"],"summary":"Set Student Exam Work Diagrams","description":"Set the diagram images of the student's work.","operationId":"set_student_exam_work_diagrams_student_exams__exam_id__set_work_diagrams_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImagesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/generate-latex-pdf":{"post":{"tags":["student-exams"],"summary":"Generate Student Exam Pdf","description":"Generate a PDF for the given `field` of a student exam.\nNow uses structured PDF generation when available, with fallback to legacy method.","operationId":"generate_student_exam_pdf_student_exams__exam_id__generate_latex_pdf_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneratePdfRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/generate-structured-subject":{"post":{"tags":["student-exams"],"summary":"Generate Structured Subject","description":"Generate a structured exam subject with individual exercises.\nThis is the new preferred method that mirrors teacher exam functionality.","operationId":"generate_structured_subject_student_exams__exam_id__generate_structured_subject_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateStructuredSubjectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStructuredExercisesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/exercises":{"get":{"tags":["student-exams"],"summary":"Get Student Exam Exercises","description":"Get structured exercises for a student exam, with fallback to parsing unstructured content.","operationId":"get_student_exam_exercises_student_exams__exam_id__exercises_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStructuredExercisesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/generate-structured-correction":{"post":{"tags":["student-exams"],"summary":"Generate Structured Correction","description":"Generate structured corrections for the exam exercises.","operationId":"generate_structured_correction_student_exams__exam_id__generate_structured_correction_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStudentExamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-exams/{exam_id}/generate-structured-pdf":{"post":{"tags":["student-exams"],"summary":"Generate Structured Pdf","description":"Generate a PDF using the new structured approach.\nSupports 'exercises' (subject) and 'corrections' fields.","operationId":"generate_structured_pdf_student_exams__exam_id__generate_structured_pdf_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exam_id","in":"path","required":true,"schema":{"type":"string","title":"Exam Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneratePdfRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/progression":{"get":{"tags":["Progression"],"summary":"Get Progression Summary","description":"Fetch the progression summary for the current user.\nAggregates data from homework exercises, exercise sessions,\ncustom courses, and exam prep, including timeseries data.","operationId":"get_progression_summary_progression_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgressionSummary"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/settings/profile":{"get":{"tags":["Settings"],"summary":"Get Parameters","description":"Return the current user's parameters.","operationId":"get_parameters_settings_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParametersOut"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"patch":{"tags":["Settings"],"summary":"Update Parameters","description":"Update the current user's parameters.","operationId":"update_parameters_settings_profile_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParametersUpdateIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParametersOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/settings/account":{"delete":{"tags":["Settings"],"summary":"Delete Account","description":"Delete a user's account by removing it from the database.\nIf user_id is provided, requires admin role to delete that user.\nOtherwise, deletes the current user's own account.\n\nIf merge_into_email is provided, all content from the deleted user\nwill be transferred to the user with that email before deletion.","operationId":"delete_account_settings_account_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"merge_into_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merge Into Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/inbox/items":{"get":{"tags":["Teacher"],"summary":"Get Teacher Inbox Items","description":"Return teacher-specific inbox rows for assignments and copy corrections.","operationId":"get_teacher_inbox_items_teacher_inbox_items_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherInboxItemsResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher/classes":{"get":{"tags":["Teacher"],"summary":"Get Teacher Classes","operationId":"get_teacher_classes_teacher_classes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Teacher"],"summary":"Create Class","description":"Create a new class for the current teacher.\nGenerates a random `class_code` for students to link.","operationId":"create_class_teacher_classes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateClassBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher/classes/{class_id}":{"get":{"tags":["Teacher"],"summary":"Get Class Details","operationId":"get_class_details_teacher_classes__class_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Teacher"],"summary":"Delete Class","description":"Delete a class and all its associated data (students, single-use codes, etc.).","operationId":"delete_class_teacher_classes__class_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/name":{"put":{"tags":["Teacher"],"summary":"Update Class Name","description":"Update the name of a class owned by the current teacher.","operationId":"update_class_name_teacher_classes__class_id__name_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateClassNameBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/grade":{"put":{"tags":["Teacher"],"summary":"Update Class Grade","description":"Update the optional grade of a class owned by the current teacher.","operationId":"update_class_grade_teacher_classes__class_id__grade_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateClassGradeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/remove-student":{"post":{"tags":["Teacher"],"summary":"Remove Student From Class","description":"Remove a student from a given class.","operationId":"remove_student_from_class_teacher_classes__class_id__remove_student_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveStudentBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/link":{"post":{"tags":["Teacher"],"summary":"Link Student To Class","description":"Allows a student to join a class by providing the class_code.","operationId":"link_student_to_class_teacher_classes_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__teacher__LinkClassBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher/students/{student_id}/generate-recovery-code":{"post":{"tags":["Teacher"],"summary":"Generate Email Recovery Code","description":"Generate a recovery code for a student to retrieve their email address.\nCode is valid for 48 hours.","operationId":"generate_email_recovery_code_teacher_students__student_id__generate_recovery_code_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"student_id","in":"path","required":true,"schema":{"type":"string","title":"Student Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailRecoveryCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/toggle-single-use-mode":{"put":{"tags":["Teacher"],"summary":"Toggle Single Use Mode","description":"Toggle single-use code mode for a class.","operationId":"toggle_single_use_mode_teacher_classes__class_id__toggle_single_use_mode_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToggleSingleUseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/generate-single-use-codes":{"post":{"tags":["Teacher"],"summary":"Generate Single Use Codes","description":"Generate multiple single-use codes for a class.","operationId":"generate_single_use_codes_teacher_classes__class_id__generate_single_use_codes_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateCodesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/single-use-codes":{"get":{"tags":["Teacher"],"summary":"Get Single Use Codes","description":"Get all single-use codes for a class.","operationId":"get_single_use_codes_teacher_classes__class_id__single_use_codes_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Teacher"],"summary":"Clear Unused Single Use Codes","description":"Clear all unused single-use codes for a class.","operationId":"clear_unused_single_use_codes_teacher_classes__class_id__single_use_codes_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/single-use-codes/{code_id}":{"delete":{"tags":["Teacher"],"summary":"Delete Single Use Code","description":"Delete an unused single-use code.","operationId":"delete_single_use_code_teacher_classes__class_id__single_use_codes__code_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"code_id","in":"path","required":true,"schema":{"type":"string","title":"Code Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/upload-student-list":{"post":{"tags":["Teacher"],"summary":"Upload Student List","description":"Parse a CSV/XLSX file and return the list of students for preview.\nChecks for duplicates against existing students and pending students.\nDoes NOT create pending students yet - that happens on confirm.\n\nWith use_ai=True, the AI fallback reads the raw rows (capped at 60 lines)\ninstead of the deterministic parser — for exports whose shape we don't\nrecognize.","operationId":"upload_student_list_teacher_classes__class_id__upload_student_list_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadStudentListRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadStudentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/confirm-student-list":{"post":{"tags":["Teacher"],"summary":"Confirm Student List","description":"Create pending students from the confirmed list.\nFor students with email: generate single-use code and send invitation email.","operationId":"confirm_student_list_teacher_classes__class_id__confirm_student_list_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmStudentListRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmStudentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/pending-students":{"get":{"tags":["Teacher"],"summary":"Get Pending Students","description":"Get all pending students for a class.","operationId":"get_pending_students_teacher_classes__class_id__pending_students_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/pending-students/{pending_student_id}":{"delete":{"tags":["Teacher"],"summary":"Remove Pending Student","description":"Remove a pending student.\nIf they had a single-use code (from email invite), delete that code too.","operationId":"remove_pending_student_teacher_classes__class_id__pending_students__pending_student_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"pending_student_id","in":"path","required":true,"schema":{"type":"string","title":"Pending Student Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/toggle-student-mode":{"post":{"tags":["Teacher"],"summary":"Toggle Student Mode","description":"Toggle teacher's student mode on/off.\nWhen entering student mode, automatically creates shadow StudentClassLink entries\nfor all teacher's classes so they can see assigned content as students.","operationId":"toggle_student_mode_teacher_toggle_student_mode_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentModeToggleResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher/classes/{class_id}/student-permissions":{"get":{"tags":["Teacher"],"summary":"Get Student Permissions","operationId":"get_student_permissions_teacher_classes__class_id__student_permissions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StudentPermissionResponse"},"title":"Response Get Student Permissions Teacher Classes  Class Id  Student Permissions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/students/{student_id}/permissions":{"put":{"tags":["Teacher"],"summary":"Update Student Permissions","operationId":"update_student_permissions_teacher_classes__class_id__students__student_id__permissions_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"student_id","in":"path","required":true,"schema":{"type":"string","title":"Student Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStudentPermissionsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student/inbox/items":{"get":{"tags":["Student"],"summary":"Get Student Inbox Items","operationId":"get_student_inbox_items_student_inbox_items_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentInboxItemsResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/classes/join-info/{code}":{"get":{"tags":["Student"],"summary":"Get Class Join Info","description":"Get information about a class before joining, including pending students list.\nUsed to determine if the student needs to select their name from a dropdown.","operationId":"get_class_join_info_student_classes_join_info__code__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassJoinInfoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student/classes/link":{"post":{"tags":["Student"],"summary":"Link Student To Class","description":"Allows a student to join a class by providing either a regular class code or single-use code.\nIf the class has pending students, the student must select their name from the list.","operationId":"link_student_to_class_student_classes_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__student__LinkClassBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/classes":{"get":{"tags":["Student"],"summary":"Get Linked Classes","description":"Returns the list of classes the student is enrolled in,\nalong with the teacher's name/email if desired.","operationId":"get_linked_classes_student_classes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/contact-info":{"post":{"tags":["Student"],"summary":"Save Student Contact Info","description":"Saves a student's contact information (phone number) for a specific class.","operationId":"save_student_contact_info_student_contact_info_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentContactInfoBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/content/assigned-courses":{"get":{"tags":["Student Content"],"summary":"Get Assigned Courses","description":"Get all AI-generated courses assigned to the student through their classes.\n\nReturns courses that are:\n- Assigned to classes the student is linked to\n- Visible to students (is_visible_to_students=True)\n- Available (start_date is null or has passed)","operationId":"get_assigned_courses_student_content_assigned_courses_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/StudentAssignedCourseResponse"},"type":"array","title":"Response Get Assigned Courses Student Content Assigned Courses Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/content/assigned-courses/{course_id}":{"get":{"tags":["Student Content"],"summary":"Get Assigned Course Details","description":"Get the full details of a specific assigned course.\n\nVerifies that:\n- The course is assigned to a class the student is linked to\n- The assignment is visible to students\n- The assignment is available (start_date has passed or is null)\n\nReturns both the course details and assignment information.","operationId":"get_assigned_course_details_student_content_assigned_courses__course_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentCourseAccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student/content/assigned-courses/{course_id}/flashcards":{"get":{"tags":["Student Content"],"summary":"Get Assigned Course Flashcards","description":"Get all flashcards for a specific assigned course.\n\nVerifies that the student has access to the course before returning flashcards.\nRespects the teacher's sharing options for flashcards.","operationId":"get_assigned_course_flashcards_student_content_assigned_courses__course_id__flashcards_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Flashcard"},"title":"Response Get Assigned Course Flashcards Student Content Assigned Courses  Course Id  Flashcards Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student/content/assigned-courses/{course_id}/qcms":{"get":{"tags":["Student Content"],"summary":"Get Assigned Course Qcms","description":"Get all QCMs for a specific assigned course.\n\nVerifies that the student has access to the course before returning QCMs.\nRespects the teacher's sharing options for QCMs.","operationId":"get_assigned_course_qcms_student_content_assigned_courses__course_id__qcms_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/QCM"},"title":"Response Get Assigned Course Qcms Student Content Assigned Courses  Course Id  Qcms Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/devices":{"post":{"tags":["notifications"],"summary":"Register Device","description":"Register a device token for push notifications","operationId":"register_device_notifications_devices_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceTokenRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/notifications/devices/{token}":{"delete":{"tags":["notifications"],"summary":"Delete Device","description":"Delete a device token","operationId":"delete_device_notifications_devices__token__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/preferences":{"get":{"tags":["notifications"],"summary":"Get Preferences","description":"Get user notification preferences","operationId":"get_preferences_notifications_preferences_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["notifications"],"summary":"Update Preferences","description":"Update user notification preferences","operationId":"update_preferences_notifications_preferences_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreferences"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/notifications/permissions/status":{"get":{"tags":["notifications"],"summary":"Get Permission Status","description":"Check if the user has ever made a decision about notification permissions.\nReturns the current permission status and when it was last updated.","operationId":"get_permission_status_notifications_permissions_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPermissionStatus"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/notifications/send":{"post":{"tags":["notifications"],"summary":"Send Notification","description":"Send a push notification to users.\nSupports both iOS and other platforms.\nOnly sends to the most recently updated token per user per platform.","operationId":"send_notification_notifications_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/notifications/event-configs":{"get":{"tags":["notifications"],"summary":"List Event Configs","description":"List all notification event configurations (admin only). Seeds defaults if empty.","operationId":"list_event_configs_notifications_event_configs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/notifications/event-configs/{event_type}":{"put":{"tags":["notifications"],"summary":"Update Event Config","description":"Update a notification event configuration (admin only).","operationId":"update_event_config_notifications_event_configs__event_type__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"event_type","in":"path","required":true,"schema":{"type":"string","title":"Event Type"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEventConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"tags":["Root"],"summary":"Root Route","description":"Root route that redirects the user based on their country.\nIf the user is from the US, redirect to /book-call, otherwise /home.","operationId":"root_route__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/us/home":{"get":{"tags":["home"],"summary":"Get Home Data","description":"Get home page data for the US student, including:\n- Personal info\n- Next session\n- Unseen feedback\n- Past and upcoming sessions with basic info","operationId":"get_home_data_us_home_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HomeData"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/session/{session_id}":{"get":{"tags":["session"],"summary":"Get Session Data","description":"Retrieves the Session by ID (must be in current user's next_sessions or prev_sessions).\nAlso fetches the corresponding Topic for latex/images.","operationId":"get_session_data_session__session_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__us_session__SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/session/{session_id}/upload-work":{"post":{"tags":["session"],"summary":"Upload Student Work","description":"Upload student work images for a session.","operationId":"upload_student_work_session__session_id__upload_work_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadWorkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/session/{session_id}/download-exercises":{"get":{"tags":["session"],"summary":"Download Exercises As Pdf","description":"Generate a PDF from the topic's LaTeX exercise content.","operationId":"download_exercises_as_pdf_session__session_id__download_exercises_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/session/{session_id}/chat":{"post":{"tags":["session"],"summary":"Send Session Message","description":"POST a user message to the session's conversation_history.\nReuses the same approach from conversation_service -> append_message(...).","operationId":"send_session_message_session__session_id__chat_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__us_session__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/session/{session_id}/chat/stream":{"get":{"tags":["session"],"summary":"Create Session Chat Stream","description":"SSE endpoint that streams the assistant's response chunk by chunk.","operationId":"create_session_chat_stream_session__session_id__chat_stream_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","description":"JWT Bearer token","title":"Token"},"description":"JWT Bearer token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/session/{session_id}/chat-history":{"get":{"tags":["session"],"summary":"Get Session Chat History","description":"Returns the conversation_history for a given session, in a frontend-friendly format.","operationId":"get_session_chat_history_session__session_id__chat_history_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__us_session__ChatHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/session/{session_id}/chat/reset":{"post":{"tags":["session"],"summary":"Reset Session Conversation","description":"Archives the current conversation in conversation_history_archive, then clears conversation_history.","operationId":"reset_session_conversation_session__session_id__chat_reset_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__us_session__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/session/{session_id}/reflexion/audio":{"post":{"tags":["session"],"summary":"Upload Reflexion Audio","description":"Upload reflection audio to S3 and return the URL","operationId":"upload_reflexion_audio_session__session_id__reflexion_audio_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__us_session__FileUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/session/{session_id}/reflexion":{"post":{"tags":["session"],"summary":"Save Reflexion","description":"Save the reflection to the session and update the student's session lists and topics.\nAlso awards XP for completing the session.","operationId":"save_reflexion_session__session_id__reflexion_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Reflexion"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/session/admin/needs-feedback":{"get":{"tags":["session"],"summary":"Get Sessions Needing Feedback","description":"Get all sessions that have student work but no feedback.","operationId":"get_sessions_needing_feedback_session_admin_needs_feedback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SessionNeedingFeedback"},"type":"array","title":"Response Get Sessions Needing Feedback Session Admin Needs Feedback Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/session/admin/{session_id}/feedback":{"post":{"tags":["session"],"summary":"Submit Session Feedback","description":"Submit feedback for a session.","operationId":"submit_session_feedback_session_admin__session_id__feedback_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackSubmission"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/session/admin/feedback/upload-media":{"post":{"tags":["session"],"summary":"Upload Feedback Media","description":"Upload media (audio, image) for feedback to S3 and return the URL","operationId":"upload_feedback_media_session_admin_feedback_upload_media_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__us_session__FileUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/session/{session_id}/feedback":{"get":{"tags":["session"],"summary":"Get Session Feedback","description":"Get feedback data for a session.","operationId":"get_session_feedback_session__session_id__feedback_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Session Feedback Session  Session Id  Feedback Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/session/{session_id}/feedback/seen":{"post":{"tags":["session"],"summary":"Mark Feedback As Seen","description":"Mark feedback as seen.","operationId":"mark_feedback_as_seen_session__session_id__feedback_seen_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/session/{session_id}/chat/audio":{"post":{"tags":["session"],"summary":"Upload Session Audio","description":"Upload audio for chat, get transcription, and send message in one step.","operationId":"upload_session_audio_session__session_id__chat_audio_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__us_session__FileUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/math-tutor/session":{"post":{"tags":["math-tutor"],"summary":"Create Session","description":"Create a new session with OpenAI Realtime API","operationId":"create_session_math_tutor_session_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/math-tutor/tools/equation-solver":{"post":{"tags":["math-tutor"],"summary":"Equation Solver","description":"Solve a mathematical equation","operationId":"equation_solver_math_tutor_tools_equation_solver_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/math-tutor/tools/plot-graph":{"post":{"tags":["math-tutor"],"summary":"Plot Graph","description":"Generate data for plotting a function","operationId":"plot_graph_math_tutor_tools_plot_graph_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/math-tutor/tools/check-understanding":{"post":{"tags":["math-tutor"],"summary":"Check Understanding","description":"Generate practice problems to check understanding","operationId":"check_understanding_math_tutor_tools_check_understanding_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/math-tutor/tools/render-equation":{"post":{"tags":["math-tutor"],"summary":"Render Equation Endpoint","description":"Validate and return LaTeX for equation rendering","operationId":"render_equation_endpoint_math_tutor_tools_render_equation_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/math-tutor/transcript/{session_id}":{"post":{"tags":["math-tutor"],"summary":"Save Transcript Item","description":"Save a transcript item to the database","operationId":"save_transcript_item_math_tutor_transcript__session_id__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptItem"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["math-tutor"],"summary":"Get Transcript","description":"Get the transcript for a session","operationId":"get_transcript_math_tutor_transcript__session_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/math-tutor/sessions":{"get":{"tags":["math-tutor"],"summary":"Get Sessions","description":"Get all math tutor sessions for the current user","operationId":"get_sessions_math_tutor_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/math-tutor/instructions":{"get":{"tags":["math-tutor"],"summary":"Get Math Tutor Instructions","description":"Get the math tutor instructions from system settings","operationId":"get_math_tutor_instructions_math_tutor_instructions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/us-onboarding/status":{"get":{"tags":["US Onboarding"],"summary":"Get Onboarding Status","description":"Check if the current US student has completed the onboarding process.","operationId":"get_onboarding_status_us_onboarding_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingStatusResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/us-onboarding/mark-completed":{"post":{"tags":["US Onboarding"],"summary":"Mark Onboarding Completed","description":"Mark the current US student as having completed the onboarding process.","operationId":"mark_onboarding_completed_us_onboarding_mark_completed_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingStatusResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/us-onboarding/courses-topics":{"get":{"tags":["US Onboarding"],"summary":"Get Courses And Topics","description":"Get all course names and their topics for US onboarding.\nRequires authentication as a US student.","operationId":"get_courses_and_topics_us_onboarding_courses_topics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CourseWithTopics"},"type":"array","title":"Response Get Courses And Topics Us Onboarding Courses Topics Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/us-onboarding/course-topic-questions/{course_name}/{topic_name}":{"get":{"tags":["US Onboarding"],"summary":"Get Course Topic Questions","description":"Get all questions for a specific course and topic, organized by level.\nRequires authentication as a US student.","operationId":"get_course_topic_questions_us_onboarding_course_topic_questions__course_name___topic_name__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_name","in":"path","required":true,"schema":{"type":"string","title":"Course Name"}},{"name":"topic_name","in":"path","required":true,"schema":{"type":"string","title":"Topic Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseTopicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/us-onboarding/save-performance":{"post":{"tags":["US Onboarding"],"summary":"Save Onboarding Performance","description":"Save a user's performance for a specific topic during the onboarding assessment.\nRequires authentication as a US student.\n\nIf the user already has performance data for this course and topic,\nit will be removed before saving the new data. If the collection doesn't exist yet,\nthe deletion step will be skipped.","operationId":"save_onboarding_performance_us_onboarding_save_performance_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveOnboardingPerformanceRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Save Onboarding Performance Us Onboarding Save Performance Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/us-onboarding/admin/students-performance":{"get":{"tags":["US Onboarding"],"summary":"Get Students Onboarding Performance","description":"Admin endpoint to get onboarding performance data for US students with no active sessions.\n\nReturns performance data grouped by course name and only includes students that:\n1. Have role 'us_student'\n2. Have no next OR previous sessions\n3. Have at least one entry in the user_onboarding_performance collection","operationId":"get_students_onboarding_performance_us_onboarding_admin_students_performance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/StudentOnboardingPerformance"},"type":"array","title":"Response Get Students Onboarding Performance Us Onboarding Admin Students Performance Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/us-onboarding/save-parent-email":{"post":{"tags":["US Onboarding"],"summary":"Save Parent Email","description":"Save the parent's email address for the current US student.","operationId":"save_parent_email_us_onboarding_save_parent_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveParentEmailRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Save Parent Email Us Onboarding Save Parent Email Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/us-onboarding/conversation":{"post":{"tags":["US Onboarding"],"summary":"Save Conversation Log","description":"Saves the conversation log from the hobbies agent.\nNo auth required as this is called from the agent.\nIf a conversation for this user_id already exists, it will be replaced.","operationId":"save_conversation_log_us_onboarding_conversation_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationLogInput"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Save Conversation Log Us Onboarding Conversation Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/health":{"get":{"tags":["Agent"],"summary":"Health Check","description":"API health check endpoint.","operationId":"health_check_agent_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/agent/types":{"get":{"tags":["Agent"],"summary":"Get Agent Types","description":"Get all available agent types by listing files in the agents/entrypoints directory.","operationId":"get_agent_types_agent_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/agent/start":{"post":{"tags":["Agent"],"summary":"Start Agent","description":"Start a new agent session with the default agent (vision).","operationId":"start_agent_agent_start_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/agent/start/{agent_type}":{"post":{"tags":["Agent"],"summary":"Start Agent With Name Endpoint","description":"Start a new agent session with the specified agent type.","operationId":"start_agent_with_name_endpoint_agent_start__agent_type__post","parameters":[{"name":"agent_type","in":"path","required":true,"schema":{"type":"string","title":"Agent Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/session-context/{session_id}":{"get":{"tags":["Agent"],"summary":"Get Agent Session Context","description":"Return stored agent context for a LiveKit worker.\n\nLiveKit room metadata must remain small, so rooms carry only a session reference.\nThe agent worker uses this endpoint to load the larger agent_data payload.","operationId":"get_agent_session_context_agent_session_context__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"room_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional room name guard for the session lookup","title":"Room Name"},"description":"Optional room name guard for the session lookup"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Agent Session Context Agent Session Context  Session Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/save-transcript":{"post":{"tags":["Agent"],"summary":"Save Transcript","description":"Save the conversation transcript for a session.","operationId":"save_transcript_agent_save_transcript_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/upload/video":{"post":{"tags":["Upload"],"summary":"Upload Video","description":"Upload a video file using base64 encoding.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_video_upload_video_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upload Video Upload Video Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/folders/root":{"get":{"tags":["folders"],"summary":"Get Shared Root","description":"Get ALL folders (owned + shared) with sharing status tags for root view.","operationId":"get_shared_root_folders_root_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_type","in":"query","required":true,"schema":{"type":"string","title":"Folder Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/folders/{folder_id}/contents":{"get":{"tags":["folders"],"summary":"Get Folder Contents","description":"List folders and items under a given folder, if the user has access.\nUses the centralized sharing service for access control.\nReturns both child folders and items (exercises/exams) based on folder type.","operationId":"get_folder_contents_folders__folder_id__contents_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/folders/":{"post":{"tags":["folders"],"summary":"Create Folder","description":"Create a new folder","operationId":"create_folder_folders__post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["folders"],"summary":"List Folders","description":"List user's accessible folders with hierarchy support","operationId":"list_folders_folders__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_type","in":"query","required":true,"schema":{"type":"string","title":"Folder Type"}},{"name":"parent_folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FolderResponse"},"title":"Response List Folders Folders  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/folders/{folder_id}":{"put":{"tags":["folders"],"summary":"Update Folder","description":"Update folder name (rename).\n\nOnly folder owners can rename folders.","operationId":"update_folder_folders__folder_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["folders"],"summary":"Delete Folder","description":"Delete folder and recursively delete all contents (child folders, exams, exercises).\n\nOnly folder owners can delete folders.","operationId":"delete_folder_folders__folder_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/folders/{folder_id}/move":{"put":{"tags":["folders"],"summary":"Move Folder","description":"Move folder to a different parent.\n\nOnly folder owners can move folders.","operationId":"move_folder_folders__folder_id__move_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderMoveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Move Folder Folders  Folder Id  Move Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/folders/{folder_id}/share":{"post":{"tags":["folders"],"summary":"Share Folder","description":"Share a folder with proper permission checks.\n\nOnly folder owners can share folders.","operationId":"share_folder_folders__folder_id__share_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareOptions"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/folders/{folder_id}/path":{"get":{"tags":["folders"],"summary":"Get Folder Path","description":"Get folder path for breadcrumbs","operationId":"get_folder_path_folders__folder_id__path_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FolderPathItem"},"title":"Response Get Folder Path Folders  Folder Id  Path Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments":{"post":{"tags":["teacher_assignments"],"summary":"Create Teacher Assignment","description":"Creates a new exercise assignment.\nAssignment is created as a draft by default and can be configured later.\nclass_id is optional - assignments can be created without a class assigned.\nReturns the assignment_id in both the 'message' field and 'assignment_id' field of BasicResponse.","operationId":"create_teacher_assignment_teacher_assignments_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherAssignmentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_assignments__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["teacher_assignments"],"summary":"Get Teacher Assignments","description":"Get all assignments created by this teacher, optionally filtered by folder.","operationId":"get_teacher_assignments_teacher_assignments_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TeacherAssignmentResponse"},"title":"Response Get Teacher Assignments Teacher Assignments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/from-chat-attachment":{"post":{"tags":["teacher_assignments"],"summary":"Create Or Get Teacher Assignment From Chat Attachment","description":"Create a draft assignment from a teacher-chat CTA, or return the assignment\nalready created from the same chat with identical exercise contents.","operationId":"create_or_get_teacher_assignment_from_chat_attachment_teacher_assignments_from_chat_attachment_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherAssignmentFromChatAttachmentCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherAssignmentFromChatAttachmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher/assignments/school-teachers":{"get":{"tags":["teacher_assignments"],"summary":"Get School Teachers","description":"Get all teachers in the same school as the current teacher.\nUses school membership or email domain to determine school affiliation.","operationId":"get_school_teachers_teacher_assignments_school_teachers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_assignments__SchoolTeachersResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher/assignments/{assignment_id}/move":{"put":{"tags":["teacher_assignments"],"summary":"Move Assignment To Folder","description":"Move an assignment to a folder or to root.","operationId":"move_assignment_to_folder_teacher_assignments__assignment_id__move_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveAssignmentToFolderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Move Assignment To Folder Teacher Assignments  Assignment Id  Move Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/summary":{"get":{"tags":["teacher_assignments"],"summary":"Get Teacher Assignment Summary","description":"Return lightweight assignment summary with exercise stubs.","operationId":"get_teacher_assignment_summary_teacher_assignments__assignment_id__summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignmentSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}":{"get":{"tags":["teacher_assignments"],"summary":"Get Teacher Assignment Details","description":"Get details of an assignment, including exercises and student progress.","operationId":"get_teacher_assignment_details_teacher_assignments__assignment_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignmentDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["teacher_assignments"],"summary":"Delete Teacher Assignment","description":"Delete a teacher assignment.","operationId":"delete_teacher_assignment_teacher_assignments__assignment_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_assignments__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["teacher_assignments"],"summary":"Update Teacher Assignment","description":"Update an existing teacher assignment.\nIf exercise_ids are changed, also update any existing student sessions.","operationId":"update_teacher_assignment_teacher_assignments__assignment_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherAssignmentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_assignments__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/duplicate":{"post":{"tags":["teacher_assignments"],"summary":"Duplicate Teacher Assignment","description":"Duplicate a teacher assignment. Class is optional - if not provided, creates a draft copy.","operationId":"duplicate_teacher_assignment_teacher_assignments__assignment_id__duplicate_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateAssignmentRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_assignments__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/download":{"get":{"tags":["teacher_assignments"],"summary":"Download Teacher Assignment Document","description":"Download an assignment as PDF or DOCX with optional solutions.","operationId":"download_teacher_assignment_document_teacher_assignments__assignment_id__download_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"pdf","title":"Format"}},{"name":"variant","in":"query","required":false,"schema":{"type":"string","default":"exercises","title":"Variant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/import-teacher-exercises":{"post":{"tags":["teacher_assignments"],"summary":"Import Teacher Exercises To Assignment","description":"Import exercises from teacher's exercise library to an assignment.\nThis copies the content and solution from selected teacher exercises.","operationId":"import_teacher_exercises_to_assignment_teacher_assignments__assignment_id__import_teacher_exercises_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportTeacherExercisesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoSaveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/generate-similar-exercise":{"post":{"tags":["teacher_assignments"],"summary":"Generate Similar Exercise","description":"Generate a similar exercise based on an existing exercise in the assignment.\nUses AI to create a variation with the provided custom prompt.","operationId":"generate_similar_exercise_teacher_assignments__assignment_id__generate_similar_exercise_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSimilarExerciseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSimilarExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/split-exercise":{"post":{"tags":["teacher_assignments"],"summary":"Split Exercise","description":"Split an existing exercise into multiple exercises using AI.\nUses AI to create multiple variations of the original exercise.","operationId":"split_exercise_teacher_assignments__assignment_id__split_exercise_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SplitExerciseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SplitExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/title":{"put":{"tags":["teacher_assignments"],"summary":"Update Assignment Title","description":"Update the title of an assignment - follows exact teacher exam pattern.","operationId":"update_assignment_title_teacher_assignments__assignment_id__title_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAssignmentTitleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTitleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/classes":{"put":{"tags":["teacher_assignments"],"summary":"Update Assignment Classes","description":"Update the classes assigned to an assignment.","operationId":"update_assignment_classes_teacher_assignments__assignment_id__classes_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAssignmentClassesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAssignmentClassesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/dates":{"put":{"tags":["teacher_assignments"],"summary":"Update Assignment Dates","description":"Update the start and due dates of an assignment.","operationId":"update_assignment_dates_teacher_assignments__assignment_id__dates_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDatesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoSaveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/schedules/{class_id}":{"put":{"tags":["teacher_assignments"],"summary":"Update Assignment Class Schedule","description":"Set ONE class's dates for this devoir (per-class planning): when the\nclass sees it and when it is due. A past class, or a past devoir, is\nread-only.","operationId":"update_assignment_class_schedule_teacher_assignments__assignment_id__schedules__class_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAssignmentClassScheduleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignmentClassSchedulesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/exercises/order":{"put":{"tags":["teacher_assignments"],"summary":"Update Exercise Order","description":"Update the order of exercises in an assignment.","operationId":"update_exercise_order_teacher_assignments__assignment_id__exercises_order_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoSaveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/exercises":{"post":{"tags":["teacher_assignments"],"summary":"Add Exercises To Assignment","description":"Add exercises to an assignment.","operationId":"add_exercises_to_assignment_teacher_assignments__assignment_id__exercises_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddExercisesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoSaveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/exercises/{exercise_id}":{"get":{"tags":["teacher_assignments"],"summary":"Get Assignment Exercise Detail","description":"Return detailed content for a single exercise within an assignment.","operationId":"get_assignment_exercise_detail_teacher_assignments__assignment_id__exercises__exercise_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignmentExerciseDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["teacher_assignments"],"summary":"Remove Exercise From Assignment","description":"Remove an exercise from an assignment.","operationId":"remove_exercise_from_assignment_teacher_assignments__assignment_id__exercises__exercise_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoSaveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/grade":{"put":{"tags":["teacher_assignments"],"summary":"Update Assignment Grade","description":"Set the level the devoir is written for.\n\nIts own level, not that of its classes: a devoir can be given to a class\nof another level as revision or to go further, and a devoir made only to\nbe printed has no class at all.","operationId":"update_assignment_grade_teacher_assignments__assignment_id__grade_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAssignmentGradeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoSaveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/settings":{"put":{"tags":["teacher_assignments"],"summary":"Update Assignment Settings","description":"Update assignment settings (randomize_order, binary_grading, typing_enabled, autonomy_mode).","operationId":"update_assignment_settings_teacher_assignments__assignment_id__settings_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSettingsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoSaveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/chat-policy/{exercise_id}":{"put":{"tags":["teacher_assignments"],"summary":"Update Exercise Chat Policy","description":"Update chat scoring policy for a specific exercise.","operationId":"update_exercise_chat_policy_teacher_assignments__assignment_id__chat_policy__exercise_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChatPolicyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoSaveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/retry-policy/{exercise_id}":{"put":{"tags":["teacher_assignments"],"summary":"Update Exercise Retry Policy","description":"Update retry policy for a specific exercise.","operationId":"update_exercise_retry_policy_teacher_assignments__assignment_id__retry_policy__exercise_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRetryPolicyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoSaveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/justification-required/{exercise_id}":{"put":{"tags":["teacher_assignments"],"summary":"Update Exercise Justification Required","description":"Update justification required policy for a specific exercise.","operationId":"update_exercise_justification_required_teacher_assignments__assignment_id__justification_required__exercise_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateJustificationRequiredRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoSaveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/class-feedback":{"get":{"tags":["teacher_assignments"],"summary":"Get Assignment Class Feedback","description":"Generate or fetch class feedback for an assignment.\nCan only be generated after assignment due date has passed.\nOnly caches the AI-generated difficulty points to avoid data duplication.\n\nAdmins can access this but won't trigger new LLM analyses - only view cached ones.","operationId":"get_assignment_class_feedback_teacher_assignments__assignment_id__class_feedback_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"force_regenerate","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force Regenerate"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassFeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/exercises/{exercise_id}/difficulty-analysis":{"post":{"tags":["teacher_assignments"],"summary":"Generate Exercise Difficulty Analysis","description":"Generate or fetch difficulty analysis for a specific exercise in an assignment.\nThis allows for progressive loading of difficulty analysis without blocking the main feedback.\n\nAdmins can access this but won't trigger new LLM analyses - only view cached ones.","operationId":"generate_exercise_difficulty_analysis_teacher_assignments__assignment_id__exercises__exercise_id__difficulty_analysis_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DifficultyAnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/exercises/{exercise_id}/chat-analysis":{"post":{"tags":["teacher_assignments"],"summary":"Generate Exercise Chat Analysis","description":"Generate or fetch chat analysis for a specific exercise in an assignment.\nThis analyzes conversation patterns and question types from student chat usage.\n\nAdmins can access this but won't trigger new LLM analyses - only view cached ones.","operationId":"generate_exercise_chat_analysis_teacher_assignments__assignment_id__exercises__exercise_id__chat_analysis_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatAnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/exercises/{exercise_id}/stats":{"get":{"tags":["teacher_assignments"],"summary":"Get Exercise Stats","description":"Get statistics for a specific exercise in an assignment.\nReturns chat message count and attempt statistics.","operationId":"get_exercise_stats_teacher_assignments__assignment_id__exercises__exercise_id__stats_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_assignments__ExerciseStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/trial-run":{"post":{"tags":["teacher_assignments"],"summary":"Get Or Create Trial Run","description":"Get or create a trial run session for a teacher to test their assignment.\nReturns existing session if found, creates new one if not.","operationId":"get_or_create_trial_run_teacher_assignments__assignment_id__trial_run_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_assignments__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/restart-trial":{"post":{"tags":["teacher_assignments"],"summary":"Restart Trial Run","description":"Create a new trial run session for a teacher, regardless of existing sessions.\nUsed when teacher wants to restart from scratch.","operationId":"restart_trial_run_teacher_assignments__assignment_id__restart_trial_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_assignments__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/review-requests":{"get":{"tags":["teacher_assignments"],"summary":"List Assignment Review Requests","operationId":"list_assignment_review_requests_teacher_assignments__assignment_id__review_requests_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"status","in":"query","required":false,"schema":{"enum":["pending","resolved","all"],"type":"string","default":"pending","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequestListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/review-requests/count":{"get":{"tags":["teacher_assignments"],"summary":"Count Assignment Review Requests","operationId":"count_assignment_review_requests_teacher_assignments__assignment_id__review_requests_count_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequestCountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/review-requests/{request_id}":{"get":{"tags":["teacher_assignments"],"summary":"Get Review Request Detail","operationId":"get_review_request_detail_teacher_assignments__assignment_id__review_requests__request_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequestDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/review-requests/{request_id}/resolve":{"post":{"tags":["teacher_assignments"],"summary":"Resolve Review Request","operationId":"resolve_review_request_teacher_assignments__assignment_id__review_requests__request_id__resolve_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequestResolveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_assignments__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/share":{"post":{"tags":["teacher_assignments"],"summary":"Create Assignment Share","description":"Create a shareable link for a teacher assignment.","operationId":"create_assignment_share_teacher_assignments__assignment_id__share_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateShareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/shared/{share_token}":{"get":{"tags":["teacher_assignments"],"summary":"Get Shared Assignment Info","description":"Get information about a shared assignment from its share token.","operationId":"get_shared_assignment_info_teacher_assignments_shared__share_token__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"share_token","in":"path","required":true,"schema":{"type":"string","title":"Share Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedAssignmentInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/shared/{share_token}/copy":{"post":{"tags":["teacher_assignments"],"summary":"Copy Shared Assignment","description":"Copy a shared assignment to the current teacher's class.","operationId":"copy_shared_assignment_teacher_assignments_shared__share_token__copy_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"share_token","in":"path","required":true,"schema":{"type":"string","title":"Share Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CopySharedAssignmentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_assignments__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/share-with-teacher":{"post":{"tags":["teacher_assignments"],"summary":"Share Assignment With Teacher","description":"Share an assignment directly with another teacher in the same school.\nCreates a copy of the assignment for the target teacher with a modified title.","operationId":"share_assignment_with_teacher_teacher_assignments__assignment_id__share_with_teacher_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareWithTeacherRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareWithTeacherResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/generate-class-remediation":{"post":{"tags":["teacher_assignments"],"summary":"Generate Class Remediation","description":"Generate a new draft assignment with 5 AI-generated remediation exercises\ntargeting the most common class-wide mistakes.","operationId":"generate_class_remediation_teacher_assignments__assignment_id__generate_class_remediation_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassRemediationRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassRemediationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-assignments":{"get":{"tags":["student_assignments"],"summary":"Get Student Assignments","description":"Get all assignments for the current user:\n1. Assignments from classes they're enrolled in (that they haven't started yet)\n2. Already started assignments (with existing exercise sessions)\n\nOptional folder_id filter:\n- None (not provided): return all assignments\n- \"\" (empty string): return only assignments NOT in any folder (root)\n- \"some_id\": return only assignments in that folder","operationId":"get_student_assignments_student_assignments_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StudentAssignmentResponse"},"title":"Response Get Student Assignments Student Assignments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-assignments/{assignment_id}/move-to-folder":{"post":{"tags":["student_assignments"],"summary":"Move Student Assignment To Folder","description":"Move a student assignment into a folder, or back to root (folder_id=None).\nUses student_assignment_folder_links collection.","operationId":"move_student_assignment_to_folder_student_assignments__assignment_id__move_to_folder_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveToFolderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-assignments/{assignment_id}/start":{"post":{"tags":["student_assignments"],"summary":"Start Assignment","description":"Start working on an assignment by creating an exercise session.\nReturns the session_id in the 'message' field of BasicResponse.","operationId":"start_assignment_student_assignments__assignment_id__start_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__exercise_assignments__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-assignments/{assignment_id}/details":{"get":{"tags":["student_assignments"],"summary":"Get Assignment Details","description":"Get specific details of an assignment needed during an exercise session.\nCurrently returns the chat_policy, retry_policy, and due_date.","operationId":"get_assignment_details_student_assignments__assignment_id__details_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignmentDetailsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/list":{"get":{"tags":["My Courses"],"summary":"List Courses","description":"List all courses for the current user.\nOptionally filter by folder_id (None returns root-level courses).","operationId":"list_courses_my_courses_list_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by folder ID (null for root)","title":"Folder Id"},"description":"Filter by folder ID (null for root)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseSummaryList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/upload":{"post":{"tags":["My Courses"],"summary":"Upload Course Images","description":"Upload base64-encoded images for a new course. This will:\n1. Upload the files to S3\n2. Create a new Course document with status \"UPLOADING\"\n3. Start a background task to process the course\n\nIf create_as_teacher is True and the user is a teacher/admin, the course\nwill be created as a teacher course (is_teacher_course=True).\n\nReturns the course_id and initial status.","operationId":"upload_course_images_my_courses_upload_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__my_courses__BatchFileUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__my_courses__CourseUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/my-courses/from-urls":{"post":{"tags":["My Courses"],"summary":"Create Course From Urls","description":"Create a new course from a list of image URLs (already uploaded) and/or a\npasted source text. Used when images have been uploaded via other means\n(e.g. PDF conversion, photos sent in the chat).\n\nIf create_as_teacher is True and the user is a teacher/admin, the course\nwill be created as a teacher course (is_teacher_course=True).","operationId":"create_course_from_urls_my_courses_from_urls_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__my_courses__CreateCourseFromUrlsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__my_courses__CourseUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/my-courses/{course_id}/status":{"get":{"tags":["My Courses"],"summary":"Get Course Status","description":"Get the current status of a course.","operationId":"get_course_status_my_courses__course_id__status_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/chat-history":{"get":{"tags":["My Courses"],"summary":"Get Chat History","description":"Fetch the conversation history for all courses.\nUses cursor iteration to prevent memory leaks from loading all documents.","operationId":"get_chat_history_my_courses_chat_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/routers__my_courses__ChatHistoryResponse"},"type":"array","title":"Response Get Chat History My Courses Chat History Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/my-courses/chat":{"post":{"tags":["My Courses"],"summary":"Send Chat Message","description":"Appends the user's message to the conversation_history\nfor the given course doc, so we can stream later.","operationId":"send_chat_message_my_courses_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__my_courses__ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__my_courses__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/my-courses/chat/stream":{"get":{"tags":["My Courses"],"summary":"Stream Chat Response","description":"Streams GPT's reply for a given course_id.\nWe'll send the last 10 messages from conversation_history,\nplus a system prompt built from the course content.\nUses shared streaming utility for connection management.","operationId":"stream_chat_response_my_courses_chat_stream_get","parameters":[{"name":"course_id","in":"query","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/{course_id}":{"get":{"tags":["My Courses"],"summary":"Get Course Details","description":"Get the full details of a course.","operationId":"get_course_details_my_courses__course_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["My Courses"],"summary":"Delete Course","description":"Delete a course and all its related data (flashcards, QCMs, etc.).","operationId":"delete_course_my_courses__course_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/{course_id}/flashcards":{"get":{"tags":["My Courses"],"summary":"Get Course Flashcards","description":"Get all flashcards for a course.","operationId":"get_course_flashcards_my_courses__course_id__flashcards_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FlashcardResponse"},"title":"Response Get Course Flashcards My Courses  Course Id  Flashcards Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/{course_id}/qcms":{"get":{"tags":["My Courses"],"summary":"Get Course Qcms","description":"Get all QCMs for a course.","operationId":"get_course_qcms_my_courses__course_id__qcms_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/QCMResponse"},"title":"Response Get Course Qcms My Courses  Course Id  Qcms Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/{course_id}/title":{"put":{"tags":["My Courses"],"summary":"Update Course Title","description":"Update the title of a course.","operationId":"update_course_title_my_courses__course_id__title_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"title","in":"query","required":true,"schema":{"type":"string","title":"Title"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/{course_id}/move":{"put":{"tags":["My Courses"],"summary":"Move Course To Folder","description":"Move a course to a folder or to root (folder_id=null).","operationId":"move_course_to_folder_my_courses__course_id__move_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveCourseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/{course_id}/revision-flashcards":{"get":{"tags":["My Courses"],"summary":"Get Course Revision Flashcards","description":"Get all revision flashcards (course_global) for a course.\nThese flashcards are designed for revising the entire course content.","operationId":"get_course_revision_flashcards_my_courses__course_id__revision_flashcards_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FlashcardResponse"},"title":"Response Get Course Revision Flashcards My Courses  Course Id  Revision Flashcards Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/{course_id}/audio":{"post":{"tags":["My Courses"],"summary":"Upload Audio","description":"Transcribe user audio and store transcript in user-specific conversation.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_audio_my_courses__course_id__audio_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__my_courses__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/{course_id}/conversation/reset":{"post":{"tags":["My Courses"],"summary":"Reset Conversation","description":"Clear the user's conversation history for this course.","operationId":"reset_conversation_my_courses__course_id__conversation_reset_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__my_courses__BasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/{course_id}/pdf":{"get":{"tags":["My Courses"],"summary":"Download Course Pdf","description":"Generate and download a PDF of the course content.\nUses deterministic JIT (just-in-time) LaTeX conversion without persisting LaTeX.\nIncludes support for graph illustrations.","operationId":"download_course_pdf_my_courses__course_id__pdf_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"include_revision_deck","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Revision Deck"}},{"name":"include_knowledge_quiz","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Knowledge Quiz"}},{"name":"show_solutions","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Show Solutions"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/{course_id}/units/{unit_id}/regenerate":{"post":{"tags":["My Courses"],"summary":"Regenerate Course Unit Endpoint","description":"Regenerate a specific course unit using AI with custom instructions.","operationId":"regenerate_course_unit_endpoint_my_courses__course_id__units__unit_id__regenerate_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"unit_id","in":"path","required":true,"schema":{"type":"string","title":"Unit Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenerateUnitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/{course_id}/docx":{"get":{"tags":["My Courses"],"summary":"Download Course Docx","description":"Generate and download a DOCX version of the course content.\nIncludes support for graph illustrations.","operationId":"download_course_docx_my_courses__course_id__docx_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"include_revision_deck","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Revision Deck"}},{"name":"include_knowledge_quiz","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Knowledge Quiz"}},{"name":"show_solutions","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Show Solutions"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-courses/{course_id}/tex":{"get":{"tags":["My Courses"],"summary":"Download Course Tex","description":"Download the course content as a LaTeX (.tex) file.\nReturns the raw LaTeX source without compilation.","operationId":"download_course_tex_my_courses__course_id__tex_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"include_revision_deck","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Revision Deck"}},{"name":"include_knowledge_quiz","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Knowledge Quiz"}},{"name":"show_solutions","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Show Solutions"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/app-versions/":{"get":{"tags":["App Versions"],"summary":"Get App Versions","description":"Get all app versions, sorted by creation date (newest first).","operationId":"get_app_versions_app_versions__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AppVersionResponse"},"type":"array","title":"Response Get App Versions App Versions  Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["App Versions"],"summary":"Create App Version","description":"Create a new app version record.","operationId":"create_app_version_app_versions__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppVersionCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppVersionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/app-versions/check":{"post":{"tags":["App Versions"],"summary":"Check Version","description":"Check if the client app needs an update.\nThis endpoint can be called by the native app to check if an update is required.","operationId":"check_version_app_versions_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_check_version_app_versions_check_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/user/notification-preferences":{"post":{"tags":["User Preferences"],"summary":"Set User Notification Preferences","description":"Update the user's notification preferences.\nThis endpoint is called from the NotificationsStepPage in the onboarding flow.","operationId":"set_user_notification_preferences_user_notification_preferences_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreferenceData"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/tutorial/audio/transcribe":{"post":{"tags":["tutorial"],"summary":"Transcribe Tutorial Audio","description":"Simplified endpoint for transcribing audio during the tutorial.\nDoesn't require session_id or exercise_id.","operationId":"transcribe_tutorial_audio_tutorial_audio_transcribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TutorialAudioRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TutorialAudioResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher_exercises/":{"get":{"tags":["teacher_exercises"],"summary":"Get Teacher Exercises","description":"Retrieve only saved exercises created by the current teacher.","operationId":"get_teacher_exercises_teacher_exercises__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TeacherExerciseResponse"},"type":"array","title":"Response Get Teacher Exercises Teacher Exercises  Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["teacher_exercises"],"summary":"Create Teacher Exercise","description":"Create a new exercise for the teacher.","operationId":"create_teacher_exercise_teacher_exercises__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExerciseCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher_exercises/root":{"get":{"tags":["teacher_exercises"],"summary":"Get Shared Root","description":"Get teacher exercises shared with me (explicitly shared or school-wide shared).\nReplaces the complex /with-sharing endpoint.","operationId":"get_shared_root_teacher_exercises_root_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher_exercises/school-teachers":{"get":{"tags":["teacher_exercises"],"summary":"Get School Teachers","description":"Get all teachers from the same school as the current user.","operationId":"get_school_teachers_teacher_exercises_school_teachers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__teacher_exercises__SchoolTeachersResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher_exercises/{exercise_id}":{"get":{"tags":["teacher_exercises"],"summary":"Get Teacher Exercise","description":"Retrieve a specific exercise by ID, checking both ownership and sharing permissions.","operationId":"get_teacher_exercise_teacher_exercises__exercise_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["teacher_exercises"],"summary":"Update Teacher Exercise","description":"Update an existing exercise with sharing permission checks.\nCreates a new version if content fields are modified.","operationId":"update_teacher_exercise_teacher_exercises__exercise_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExerciseUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["teacher_exercises"],"summary":"Delete Teacher Exercise","description":"Delete an exercise with proper permission checks.\n\nUsers can delete if:\n- They own the exercise directly, OR\n- They have write access through folder inheritance","operationId":"delete_teacher_exercise_teacher_exercises__exercise_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher_exercises/{exercise_id}/grade":{"put":{"tags":["teacher_exercises"],"summary":"Update Teacher Exercise Grade","operationId":"update_teacher_exercise_grade_teacher_exercises__exercise_id__grade_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExerciseGradeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Teacher Exercise Grade Teacher Exercises  Exercise Id  Grade Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher_exercises/{exercise_id}/move":{"put":{"tags":["teacher_exercises"],"summary":"Move Exercise To Folder","description":"Move exercise to a different folder with proper permission checks.\n\nUsers can move if:\n- They own the exercise directly, OR\n- They have write access through folder inheritance","operationId":"move_exercise_to_folder_teacher_exercises__exercise_id__move_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveExerciseToFolderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Move Exercise To Folder Teacher Exercises  Exercise Id  Move Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher_exercises/{exercise_id}/duplicate":{"post":{"tags":["teacher_exercises"],"summary":"Duplicate Exercise","description":"Duplicate a teacher exercise.","operationId":"duplicate_exercise_teacher_exercises__exercise_id__duplicate_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher_exercises/{exercise_id}/share-with-teacher":{"post":{"tags":["teacher_exercises"],"summary":"Share Exercise With Teacher","description":"Share an exercise with another teacher of the same school by creating an\nindependent copy in their library (no live collaboration). Mirrors the\nassignment share-with-teacher behaviour.","operationId":"share_exercise_with_teacher_teacher_exercises__exercise_id__share_with_teacher_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareExerciseWithTeacherRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareExerciseWithTeacherResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher_exercises/copy_from_source":{"post":{"tags":["teacher_exercises"],"summary":"Copy Exercise From Source","description":"Copy an exercise from a public or teacher source to the current teacher's library.","operationId":"copy_exercise_from_source_teacher_exercises_copy_from_source_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CopyFromSourceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher_exercises/copy_from_exam":{"post":{"tags":["teacher_exercises"],"summary":"Copy Exercise From Exam","description":"Copy an exercise from an exam to the current teacher's exercise library.","operationId":"copy_exercise_from_exam_teacher_exercises_copy_from_exam_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CopyFromExamRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher_exercises/{exercise_id}/generate-solution":{"post":{"tags":["teacher_exercises"],"summary":"Generate Exercise Solution","description":"Generate a solution for a teacher exercise using AI.","operationId":"generate_exercise_solution_teacher_exercises__exercise_id__generate_solution_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateExerciseSolutionRequest","default":{"custom_instructions":""}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher_exercises/convert-transcript-to-exercises":{"post":{"tags":["teacher_exercises"],"summary":"Convert Transcript To Exercises","description":"Convert a transcript containing multiple exercises into individual teacher\nexercises. Text-only flow used by main's assignment editor. The\nfigure-generating image flow lives in /create-from-upload below; wiring\nthe editor's image upload to that endpoint is a tracked follow-up.","operationId":"convert_transcript_to_exercises_teacher_exercises_convert_transcript_to_exercises_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvertTranscriptToExercisesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvertTranscriptToExercisesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher_exercises/create-from-upload":{"post":{"tags":["teacher_exercises"],"summary":"Create Exercises From Upload","description":"Create teacher exercises directly from uploaded assignment images.\nThe intermediate transcription is only used server-side for parsing.","operationId":"create_exercises_from_upload_teacher_exercises_create_from_upload_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateExercisesFromUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateExercisesFromUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher_exercises/merge-into-one":{"post":{"tags":["teacher_exercises"],"summary":"Merge Exercises Into One","description":"Merge several teacher exercises into a single one.\n\nUsed by the \"mes exercices\" import flow: when an upload is parsed\ninto n>1 exercises and the teacher chooses to keep them as one. Each\nsource figure is preserved as an inline `figure://id` marker in the\nmerged content (Figure docs are NOT deleted — only the source\nexercise wrappers). The source exercises are removed afterwards.","operationId":"merge_exercises_into_one_teacher_exercises_merge_into_one_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeExercisesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher_exercises/{exercise_id}/share":{"post":{"tags":["teacher_exercises"],"summary":"Share Exercise","description":"Share a teacher exercise with proper permission checks.\n\nUsers can share if:\n- They own the exercise directly, OR\n- They have write access through folder inheritance","operationId":"share_exercise_teacher_exercises__exercise_id__share_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareExerciseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher_exercises/{exercise_id}/sharing":{"put":{"tags":["teacher_exercises"],"summary":"Update Exercise Sharing","description":"Update sharing options for a teacher exercise with proper permission checks.\n\nUsers can update sharing if:\n- They own the exercise directly, OR\n- They have write access through folder inheritance","operationId":"update_exercise_sharing_teacher_exercises__exercise_id__sharing_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExerciseSharingRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher_exercises/{exercise_id}/check-edit-permission":{"post":{"tags":["teacher_exercises"],"summary":"Check Edit Permission","description":"Check if the current user can edit the specified exercise using centralized sharing service.","operationId":"check_edit_permission_teacher_exercises__exercise_id__check_edit_permission_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher_exercises/{exercise_id}/versions":{"get":{"tags":["teacher_exercises"],"summary":"Get Exercise Versions","description":"Get all versions of an exercise with author names populated.\nRequires read access to the exercise.","operationId":"get_exercise_versions_teacher_exercises__exercise_id__versions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExerciseVersionsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher_exercises/{exercise_id}/versions/{content_id}/make-current":{"post":{"tags":["teacher_exercises"],"summary":"Set Current Exercise Version","description":"Set a specific version as the current version.\nRequires write access to the exercise.","operationId":"set_current_exercise_version_teacher_exercises__exercise_id__versions__content_id__make_current_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Current Exercise Version Teacher Exercises  Exercise Id  Versions  Content Id  Make Current Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher_exercises/{exercise_id}/edit-latex":{"post":{"tags":["teacher_exercises"],"summary":"Edit Exercise Latex","description":"Edit exercise content directly via LaTeX input, creating a new version.","operationId":"edit_exercise_latex_teacher_exercises__exercise_id__edit_latex_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExerciseEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher_exercises/{exercise_id}/edit-ai":{"post":{"tags":["teacher_exercises"],"summary":"Edit Exercise Ai","description":"Edit exercise content using AI assistance, creating a new version.","operationId":"edit_exercise_ai_teacher_exercises__exercise_id__edit_ai_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Request Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher_exercises/{exercise_id}/edit-photo":{"post":{"tags":["teacher_exercises"],"summary":"Edit Exercise Photo","description":"Edit exercise content using photo transcription, creating a new version.","operationId":"edit_exercise_photo_teacher_exercises__exercise_id__edit_photo_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Request Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherExerciseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher_exercises/{exercise_id}/download":{"get":{"tags":["teacher_exercises"],"summary":"Download Teacher Exercise Document","description":"Download a single teacher exercise as PDF or DOCX with optional solutions.","operationId":"download_teacher_exercise_document_teacher_exercises__exercise_id__download_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"pdf","title":"Format"}},{"name":"variant","in":"query","required":false,"schema":{"type":"string","default":"exercises","title":"Variant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-favorites":{"post":{"tags":["teacher_favorites"],"summary":"Add Favorite","description":"Add a favorite. Resolves the target per SPEC §5 origin rule.\n\n409 if this teacher has already favorited the same target (the partial\nunique indexes enforce this at the DB level too).","operationId":"add_favorite_teacher_favorites_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherFavoriteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherFavoriteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["teacher_favorites"],"summary":"List Favorites","description":"List the current teacher's favorites, with resolved exercise details.\n\nPulls the public/teacher exercise rows in two batched queries rather\nthan per-row — scales linearly with favorite count, flat cost per page.","operationId":"list_favorites_teacher_favorites_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TeacherFavoriteWithDetails"},"title":"Response List Favorites Teacher Favorites Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-favorites/{favorite_id}":{"delete":{"tags":["teacher_favorites"],"summary":"Remove Favorite","description":"Remove a favorite and decrement the target's `likes_count`.","operationId":"remove_favorite_teacher_favorites__favorite_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"favorite_id","in":"path","required":true,"schema":{"type":"string","title":"Favorite Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-exercise-history":{"get":{"tags":["teacher-exercise-history"],"summary":"List Exercise History","description":"List distinct library exercises the current teacher already gave.\n\nDraft assignments are excluded — only actually-given work counts.\nAll Mongo lookups are batched (one query per collection), so the cost\nstays flat regardless of assignment count.","operationId":"list_exercise_history_teacher_exercise_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TeacherExerciseHistoryEntry"},"type":"array","title":"Response List Exercise History Teacher Exercise History Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/gamification/status":{"get":{"tags":["gamification"],"summary":"Get User Gamification Status","description":"Get the user's current gamification status including XP, level, badges, and progress.\nOnly CPGE users can access this endpoint.","operationId":"get_user_gamification_status_gamification_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserGamificationStatusResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/gamification/definitions/badges":{"get":{"tags":["gamification"],"summary":"Get Badge Definitions","description":"Get all badge definitions or filter by category.","operationId":"get_badge_definitions_gamification_definitions_badges_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/BadgeCategory"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BadgeDefinitionResponse"},"title":"Response Get Badge Definitions Gamification Definitions Badges Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gamification/definitions/levels":{"get":{"tags":["gamification"],"summary":"Get Level Definitions","description":"Get all level definitions.","operationId":"get_level_definitions_gamification_definitions_levels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/LevelDefinitionResponse"},"type":"array","title":"Response Get Level Definitions Gamification Definitions Levels Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/gamification/badges/{badge_id}/claim":{"post":{"tags":["gamification"],"summary":"Claim Badge","description":"Claim a badge to receive XP rewards.","operationId":"claim_badge_gamification_badges__badge_id__claim_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"badge_id","in":"path","required":true,"schema":{"type":"string","title":"Badge Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserGamificationStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gamification/check-badges":{"post":{"tags":["gamification"],"summary":"Check Badges","operationId":"check_badges_gamification_check_badges_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/gamification/daily-quests":{"get":{"tags":["gamification"],"summary":"Get User Daily Quests","description":"Get the user's daily quests for today, including their progress on each quest.\nOnly CPGE users can access this endpoint.","operationId":"get_user_daily_quests_gamification_daily_quests_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserDailyQuestResponse"},"type":"array","title":"Response Get User Daily Quests Gamification Daily Quests Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/gamification/daily-quests/{quest_id}/claim":{"post":{"tags":["gamification"],"summary":"Claim Daily Quest","description":"Claim the reward for a completed daily quest.\nOnly CPGE users can access this endpoint.","operationId":"claim_daily_quest_gamification_daily_quests__quest_id__claim_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"quest_id","in":"path","required":true,"schema":{"type":"string","title":"Quest Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserGamificationStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/badges":{"get":{"tags":["admin-badges"],"summary":"List Badges","description":"List all badge definitions","operationId":"list_badges_admin_badges_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BadgeDefinition"},"type":"array","title":"Response List Badges Admin Badges Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["admin-badges"],"summary":"Create Badge","description":"Create a new badge definition","operationId":"create_badge_admin_badges_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadgeDefinitionCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadgeDefinition"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/badges/{badge_id}":{"put":{"tags":["admin-badges"],"summary":"Update Badge","description":"Update a badge definition","operationId":"update_badge_admin_badges__badge_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"badge_id","in":"path","required":true,"schema":{"type":"string","title":"Badge Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadgeDefinitionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadgeDefinition"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin-badges"],"summary":"Delete Badge","description":"Delete a badge definition","operationId":"delete_badge_admin_badges__badge_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"badge_id","in":"path","required":true,"schema":{"type":"string","title":"Badge Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/demo-accounts/status":{"get":{"tags":["admin-demo-accounts"],"summary":"Demo Status","operationId":"demo_status_admin_demo_accounts_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoStatusOut"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/demo-accounts/capture":{"post":{"tags":["admin-demo-accounts"],"summary":"Capture","operationId":"capture_admin_demo_accounts_capture_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotOut"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/demo-accounts/reset":{"post":{"tags":["admin-demo-accounts"],"summary":"Reset","operationId":"reset_admin_demo_accounts_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/demo-accounts/flag":{"post":{"tags":["admin-demo-accounts"],"summary":"Flag Demo User","operationId":"flag_demo_user_admin_demo_accounts_flag_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlagRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Flag Demo User Admin Demo Accounts Flag Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/quest-definitions":{"get":{"tags":["admin"],"summary":"List Quest Definitions","description":"List all quest definitions.\nOnly admins can access this endpoint.","operationId":"list_quest_definitions_admin_quest_definitions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/QuestDefinitionResponse"},"type":"array","title":"Response List Quest Definitions Admin Quest Definitions Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["admin"],"summary":"Create Quest Definition","description":"Create a new quest definition.\nOnly admins can access this endpoint.","operationId":"create_quest_definition_admin_quest_definitions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestDefinitionBase"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestDefinitionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/quest-definitions/{quest_id}":{"get":{"tags":["admin"],"summary":"Get Quest Definition","description":"Get a specific quest definition.\nOnly admins can access this endpoint.","operationId":"get_quest_definition_admin_quest_definitions__quest_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"quest_id","in":"path","required":true,"schema":{"type":"string","title":"Quest Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestDefinitionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Update Quest Definition","description":"Update a quest definition.\nOnly admins can access this endpoint.","operationId":"update_quest_definition_admin_quest_definitions__quest_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"quest_id","in":"path","required":true,"schema":{"type":"string","title":"Quest Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestDefinitionBase"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestDefinitionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Quest Definition","description":"Delete a quest definition.\nOnly admins can access this endpoint.","operationId":"delete_quest_definition_admin_quest_definitions__quest_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"quest_id","in":"path","required":true,"schema":{"type":"string","title":"Quest Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/quest-definitions/regenerate-today":{"post":{"tags":["admin"],"summary":"Regenerate Today Quests","description":"Regenerate today's quests with the latest quest definitions.\nOnly admins can access this endpoint.","operationId":"regenerate_today_quests_admin_quest_definitions_regenerate_today_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/QuestDefinitionResponse"},"type":"array","title":"Response Regenerate Today Quests Admin Quest Definitions Regenerate Today Post"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/leaderboard/join":{"post":{"tags":["leaderboard"],"summary":"Join Leaderboard","description":"Join the leaderboard. User must be at least level 2 to join.","operationId":"join_leaderboard_leaderboard_join_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinLeaderboardRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaderboardUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/leaderboard":{"get":{"tags":["leaderboard"],"summary":"Get Leaderboard","description":"Get the leaderboard data, including top users and current user's position.","operationId":"get_leaderboard_leaderboard_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":3,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__leaderboard__LeaderboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["leaderboard"],"summary":"Leave Leaderboard","description":"Remove the current user from the leaderboard.","operationId":"leave_leaderboard_leaderboard_delete","security":[{"OAuth2PasswordBearer":[]}],"responses":{"204":{"description":"Successful Response"}}}},"/binairo/plays":{"post":{"tags":["Binairo"],"summary":"Log Binairo Play","description":"Log a Binairo game start. Used for analytics (e.g. games played during\na correction session).","operationId":"log_binairo_play_binairo_plays_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogPlayBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/binairo/scores":{"post":{"tags":["Binairo"],"summary":"Submit Binairo Score","description":"Submit a Binairo solve time. Only keeps the best time per user per board size.","operationId":"submit_binairo_score_binairo_scores_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitScoreBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/binairo/leaderboard":{"get":{"tags":["Binairo"],"summary":"Get Binairo Leaderboard","description":"Get the leaderboard for a specific board size, sorted by fastest time.","operationId":"get_binairo_leaderboard_binairo_leaderboard_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"board_size","in":"query","required":false,"schema":{"type":"integer","default":4,"title":"Board Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__binairo__LeaderboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/binairo/leaderboard/schools":{"get":{"tags":["Binairo"],"summary":"Get Binairo School Leaderboard","description":"Get school leaderboard: average best time per establishment.","operationId":"get_binairo_school_leaderboard_binairo_leaderboard_schools_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"board_size","in":"query","required":false,"schema":{"type":"integer","default":4,"title":"Board Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolLeaderboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/analytics/current-period":{"get":{"tags":["teacher_analytics"],"summary":"Get Current Period Info","description":"Get the current school year and period for initializing the frontend.\nReturns the period based on today's date, except over the summer where\n\"school_year\" is returned: ten months of work beat two of holidays.\n\n`school_year` is the *teacher's* year, which turns over at the summer:\nthis endpoint only serves teacher pages.","operationId":"get_current_period_info_teacher_analytics_current_period_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher/analytics/student-activity":{"get":{"tags":["teacher_analytics"],"summary":"Get Student Activity","description":"Get student activity analytics by week:\n- Number of exercises that received a submission attempt per week\n- Recent activity based on the latest submission attempt\n\nCan be filtered by class_id or show all students across teacher's classes.\nSupports period-based filtering (t1, t2, t3, this_week, this_month, vacances_ete).\nAdmins can access any class.","operationId":"get_student_activity_teacher_analytics_student_activity_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"}},{"name":"school_year","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/analytics/class-activity":{"get":{"tags":["teacher_analytics"],"summary":"Get Class Activity","description":"Get aggregated activity statistics per class by week:\n- Number of exercises completed per class per week\n- Number of active students per class per week\n- Overall class engagement metrics\n\nDefault to showing last 4 weeks of data.","operationId":"get_class_activity_teacher_analytics_class_activity_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","default":3,"title":"Months"}},{"name":"weeks","in":"query","required":false,"schema":{"type":"integer","default":4,"title":"Weeks"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/analytics/student-sessions/{student_id}":{"get":{"tags":["teacher_analytics"],"summary":"Get Student Exercise Sessions","description":"Get all exercise sessions for a specific student.\nOnly returns sessions from classes taught by the requesting teacher.","operationId":"get_student_exercise_sessions_teacher_analytics_student_sessions__student_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"student_id","in":"path","required":true,"schema":{"type":"string","title":"Student Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/analytics/student-sessions/{student_id}/week/{week_date}":{"get":{"tags":["teacher_analytics"],"summary":"Get Student Exercise Sessions For Week","description":"Get exercise sessions for a specific student within a specific week.\nOnly returns sessions from classes taught by the requesting teacher.","operationId":"get_student_exercise_sessions_for_week_teacher_analytics_student_sessions__student_id__week__week_date__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"student_id","in":"path","required":true,"schema":{"type":"string","title":"Student Id"}},{"name":"week_date","in":"path","required":true,"schema":{"type":"string","title":"Week Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/analytics/class/{class_id}/recent-assignments":{"get":{"tags":["teacher_analytics"],"summary":"Get Class Recent Assignment Performance","description":"Get student performance across the most recent assignments for a class.\nReturns assignment summaries and per-student scores with trend analysis.","operationId":"get_class_recent_assignment_performance_teacher_analytics_class__class_id__recent_assignments_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecentAssignmentsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/analytics/classes-summary":{"get":{"tags":["teacher_analytics"],"summary":"Get Classes Summary","description":"Summary statistics for every class of this teacher: students, exercises\ncompleted, active students.\n\nThe numbers are the CLASS's, not its students': a devoir counts for the\nclass it was given to, work done on the student's own initiative counts\nfor the class they were in at that moment, and everything is bounded by\nthe class's school year. So a class created today starts at zero even if\nits students have been working all year elsewhere, and a past class keeps\nthe numbers of its year. See `domain/class_activity.py`.\n\n`period` / `school_year` are still accepted and echoed back: they are what\nthe client labels the numbers with.","operationId":"get_classes_summary_teacher_analytics_classes_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"}},{"name":"school_year","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassesSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-analytics/suggested-exercises":{"get":{"tags":["teacher_recommendations"],"summary":"Get Suggested Exercises","description":"Return up to 3 suggested public exercises for the current teacher.","operationId":"get_suggested_exercises_teacher_analytics_suggested_exercises_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"enum":["maths","physique-chimie"],"type":"string"},{"type":"null"}],"title":"Subject"}},{"name":"grade_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Soft context: prefer suggestions inside this grade (tree root). Relaxed automatically if too few hits.","title":"Grade Key"},"description":"Soft context: prefer suggestions inside this grade (tree root). Relaxed automatically if too few hits."},{"name":"chapter_display","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Soft context: prefer suggestions in this chapter. Relaxed automatically if too few hits. Expects the chapter's `display` name, not slug.","title":"Chapter Display"},"description":"Soft context: prefer suggestions in this chapter. Relaxed automatically if too few hits. Expects the chapter's `display` name, not slug."},{"name":"difficulty","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Soft context: 'easy' | 'medium' | 'hard'. Relaxed first when narrowing too aggressively.","title":"Difficulty"},"description":"Soft context: 'easy' | 'medium' | 'hard'. Relaxed first when narrowing too aggressively."},{"name":"type_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Hard filter on `public_exercises.type` (exercice | automatisme | application_du_cours).","title":"Type Filter"},"description":"Hard filter on `public_exercises.type` (exercice | automatisme | application_du_cours)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestedExercisesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-practice/recommendations":{"get":{"tags":["student_practice"],"summary":"Get Student Recommendations","operationId":"get_student_recommendations_student_practice_recommendations_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"enum":["maths","physique-chimie"],"type":"string"},{"type":"null"}],"description":"Scope recommendations to ONE matière (teacher-in-student-mode / legacy scoped surfaces). Omitted → unified: every matière the student has history in gets at least one card, with the three kinds kept distinct whenever the buckets allow.","title":"Subject"},"description":"Scope recommendations to ONE matière (teacher-in-student-mode / legacy scoped surfaces). Omitted → unified: every matière the student has history in gets at least one card, with the three kinds kept distinct whenever the buckets allow."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentRecommendationsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-practice/annales-sujets":{"get":{"tags":["student_practice"],"summary":"List Annales Sujets","description":"Full papers for the student's level, newest first.\n\n``catalog=excellence`` returns our curated 2026-bac training papers (our own\nexercises, from ``public_exercises``) instead of official annales — additive\nand removable: omit it for the original behaviour, delete the branch to\nretire the experiment.","operationId":"list_annales_sujets_student_practice_annales_sujets_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_level","in":"query","required":true,"schema":{"type":"string","description":"terminale | premiere","title":"School Level"},"description":"terminale | premiere"},{"name":"catalog","in":"query","required":false,"schema":{"type":"string","description":"annales (default) | excellence — curated Excellence bac papers","default":"annales","title":"Catalog"},"description":"annales (default) | excellence — curated Excellence bac papers"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnnaleSujetOut"},"title":"Response List Annales Sujets Student Practice Annales Sujets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student-practice/session-from-chat":{"post":{"tags":["student_practice"],"summary":"Create Session From Chat","description":"Materialise une session proposée par le chat (\"cette session te tente ?\").\n\nDeux types d'items, mixables dans l'ordre d'origine :\n- référence bibliothèque (`exercise_id`) : l'id est vérifié (existence +\n  gating library, ou existence côté `annales_exercises`) puis référencé\n  tel quel dans la session — pas de copie ; le rendu de session résout\n  déjà les deux collections (même pattern que le picker d'annales) ;\n- exercice inline rédigé par l'assistant : stocké comme row\n  `public_exercises` en library \"remediation\" (même pattern que la\n  remédiation IA — exclus des pickers par `library_filter_for`).\nUne ExerciseSession self_practice est créée sur le tout.","operationId":"create_session_from_chat_student_practice_session_from_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionFromChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionFromChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student-practice/exercise-previews":{"get":{"tags":["student_practice"],"summary":"Get Exercise Previews","description":"Student-safe batch previews of library exercises.\n\nUsed by the chat's training-session card to hydrate `<exercise_ref>`\nitems before the student accepts the session (and by the teacher chat's\nadd-exercises card). Ids may belong to `public_exercises` (library gate\napplies) or `annales_exercises` (review-flagged rows excluded). The\nprojection NEVER includes the solution; inaccessible or unknown ids are\nsilently dropped (the card degrades gracefully). Results come back in\nthe requested order.","operationId":"get_exercise_previews_student_practice_exercise_previews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"array","items":{"type":"string"},"maxItems":20,"title":"Ids"}},{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"enum":["maths","physique-chimie"],"type":"string"},{"type":"null"}],"description":"Optional matière scope; omitted → any matière.","title":"Subject"},"description":"Optional matière scope; omitted → any matière."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExercisePreviewOut"},"title":"Response Get Exercise Previews Student Practice Exercise Previews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/{course_id}/units/{unit_id}/rewrite":{"put":{"tags":["Teacher Course Structure"],"summary":"Rewrite Unit With Ai","description":"Rewrite a unit's content using AI based on the provided prompt.\n\nThis endpoint allows teachers to provide instructions for how they want\na unit to be rewritten, and the AI will generate new content accordingly.","operationId":"rewrite_unit_with_ai_teacher_courses__course_id__units__unit_id__rewrite_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"unit_id","in":"path","required":true,"schema":{"type":"string","title":"Unit Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RewriteUnitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseStructureResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/{course_id}/units/add":{"post":{"tags":["Teacher Course Structure"],"summary":"Add Unit With Ai","description":"Add a new unit to the course using AI generation based on the provided prompt.\n\nThe new unit will be inserted at the specified position, or at the end if no position is given.","operationId":"add_unit_with_ai_teacher_courses__course_id__units_add_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddUnitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseStructureResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/{course_id}/units/{unit_id}":{"delete":{"tags":["Teacher Course Structure"],"summary":"Delete Unit","description":"Delete a unit from the course.\n\nOptionally preserve the unit's flashcards and QCMs as global course content.","operationId":"delete_unit_teacher_courses__course_id__units__unit_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"unit_id","in":"path","required":true,"schema":{"type":"string","title":"Unit Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteUnitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseStructureResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Teacher Courses"],"summary":"Update Course Unit","description":"Update specific fields of a unit within a teacher course.\n\nAllows updating the title, unit_summary, and generated_content of a unit\nwithin a course that belongs to the authenticated teacher.","operationId":"update_course_unit_teacher_courses__course_id__units__unit_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"unit_id","in":"path","required":true,"schema":{"type":"string","title":"Unit Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCourseUnitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/{course_id}/units/reorder":{"put":{"tags":["Teacher Course Structure"],"summary":"Reorder Units","description":"Reorder the units in a course based on the provided unit_id list.","operationId":"reorder_units_teacher_courses__course_id__units_reorder_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderUnitsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseStructureResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/list":{"get":{"tags":["Teacher Courses"],"summary":"List Teacher Courses","description":"List all courses created by the authenticated teacher that are marked as teacher courses.\nOnly returns courses where is_teacher_course=True and user_id matches the current teacher.\nOptionally filters by folder_id (None or empty string for root-level courses).","operationId":"list_teacher_courses_teacher_courses_list_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseSummaryListWithFolders"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/{course_id}/move":{"put":{"tags":["Teacher Courses"],"summary":"Move Course To Folder","description":"Move a teacher course to a folder or to root.","operationId":"move_course_to_folder_teacher_courses__course_id__move_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveCourseToFolderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Move Course To Folder Teacher Courses  Course Id  Move Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/{course_id}":{"get":{"tags":["Teacher Courses"],"summary":"Get Teacher Course Details","description":"Get the full details of a teacher course.\nOnly returns courses where _id matches, user_id matches the current teacher,\nand is_teacher_course=True.\nAlso allows admin users to access holiday workbook courses.","operationId":"get_teacher_course_details_teacher_courses__course_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Course"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Teacher Courses"],"summary":"Delete Teacher Course","description":"Delete a teacher course and all its related data.\nOnly allows deletion of courses that belong to the authenticated teacher\nand are marked as teacher courses.\n\nDeletes:\n- The course document\n- Related flashcards\n- Related QCMs\n- TeacherCourseAssignment records","operationId":"delete_teacher_course_teacher_courses__course_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/{course_id}/assignment":{"get":{"tags":["Teacher Courses"],"summary":"Get Course Assignment","description":"Fetch the (single) assignment for this course.\n\nReturns a default skeleton with `id=None` and empty `class_ids` when no\ndocument exists yet so the frontend can render the configuration page\nimmediately. Lazy-creation happens on the first PUT.","operationId":"get_course_assignment_teacher_courses__course_id__assignment_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseAssignmentDetails"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Teacher Courses"],"summary":"Update Course Assignment","description":"Update assignment metadata (dates, sharing options, quiz settings).\n\nLazy-creates the assignment doc on first call so a teacher can configure\nsettings before adding any classes.","operationId":"update_course_assignment_teacher_courses__course_id__assignment_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCourseAssignmentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseAssignmentDetails"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/{course_id}/duplicate":{"post":{"tags":["Teacher Courses"],"summary":"Duplicate Teacher Course","description":"A brand-new course with the same content (units, flashcards, QCM,\nknowledge quiz), unassigned. The way to reuse a past, frozen course.","operationId":"duplicate_teacher_course_teacher_courses__course_id__duplicate_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateCourseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/{course_id}/chat-action":{"post":{"tags":["Teacher Courses"],"summary":"Apply Course Chat Action","description":"Apply a batch of granular edits proposed by the chat assistant on the\ncourse \"Aperçu\" page (edit/insert/delete a block, rename/add/delete a\nunit, insert a generated figure). Block numbers refer to the unit as it\nwas when the assistant proposed the batch.","operationId":"apply_course_chat_action_teacher_courses__course_id__chat_action_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseChatActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseChatActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/{course_id}/flashcards/{flashcard_id}":{"put":{"tags":["Teacher Courses"],"summary":"Update Flashcard","description":"Update the front and/or back content of a flashcard within a teacher course.\n\nAllows updating the front and back content of a flashcard that belongs\nto a course owned by the authenticated teacher.","operationId":"update_flashcard_teacher_courses__course_id__flashcards__flashcard_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"flashcard_id","in":"path","required":true,"schema":{"type":"string","title":"Flashcard Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFlashcardRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Flashcard"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Teacher Courses"],"summary":"Delete Flashcard","description":"Delete a flashcard from a teacher course.\n\nAllows deletion of a flashcard that belongs to a course owned by the authenticated teacher.","operationId":"delete_flashcard_teacher_courses__course_id__flashcards__flashcard_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"flashcard_id","in":"path","required":true,"schema":{"type":"string","title":"Flashcard Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/{course_id}/flashcards":{"post":{"tags":["Teacher Courses"],"summary":"Create Flashcard","description":"Create a new flashcard for a teacher course.\n\nCreates a new flashcard (typically for global revision) that belongs\nto a course owned by the authenticated teacher.","operationId":"create_flashcard_teacher_courses__course_id__flashcards_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFlashcardRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Flashcard"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/{course_id}/qcms/{qcm_id}":{"put":{"tags":["Teacher Courses"],"summary":"Update Qcm","description":"Update the question, options, correct answer, and/or explanation of a QCM within a teacher course.\n\nAllows updating QCM fields for a QCM that belongs to a course owned by the authenticated teacher.","operationId":"update_qcm_teacher_courses__course_id__qcms__qcm_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"qcm_id","in":"path","required":true,"schema":{"type":"string","title":"Qcm Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateQCMRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QCM"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/{course_id}/assignment/classes":{"put":{"tags":["Teacher Courses"],"summary":"Update Course Assignment Classes","description":"Replace the full set of classes assigned to this course.\n\nLazy-creates the assignment doc if none exists. Triggers a\n`new_course_assigned` notification for students in classes that were newly\nadded (diff old vs new), skips notifications when classes are removed.","operationId":"update_course_assignment_classes_teacher_courses__course_id__assignment_classes_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCourseAssignmentClassesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseAssignmentDetails"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/courses/{course_id}/assignment/schedules/{class_id}":{"put":{"tags":["Teacher Courses"],"summary":"Update Course Class Schedule","description":"Set ONE class's dates for this course (decision D11): when the class\nsees it, when its knowledge check opens and closes. Fields left out of the\npayload are untouched; fields sent as null are cleared. A past class is\nread-only.","operationId":"update_course_class_schedule_teacher_courses__course_id__assignment_schedules__class_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCourseClassScheduleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseAssignmentDetails"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student/progress/log-unit-view":{"post":{"tags":["Student Progress"],"summary":"Log Unit View","description":"Log when a student views a unit.\nUpdates unit progress and overall course progress.","operationId":"log_unit_view_student_progress_log_unit_view_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogUnitViewPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/log-flashcard-interaction":{"post":{"tags":["Student Progress"],"summary":"Log Flashcard Interaction","description":"Log flashcard interactions (flipped, rated as known/unknown).\nUpdates unit progress for unit flashcards or global revision progress.","operationId":"log_flashcard_interaction_student_progress_log_flashcard_interaction_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogFlashcardInteractionPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/log-qcm-answer":{"post":{"tags":["Student Progress"],"summary":"Log Qcm Answer","description":"Log QCM answer attempts.\nUpdates unit progress with attempt details.","operationId":"log_qcm_answer_student_progress_log_qcm_answer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogQCMAnswerPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/log-course-time":{"post":{"tags":["Student Progress"],"summary":"Log Course Time","description":"Log total time spent on a course.\nUpdates the overall time spent and last accessed timestamp.","operationId":"log_course_time_student_progress_log_course_time_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogTimeSpentPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/log-revision-session":{"post":{"tags":["Student Progress"],"summary":"Log Revision Session","description":"Log the start of a revision session.\nIncrements the revision session count.","operationId":"log_revision_session_student_progress_log_revision_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogFlashcardInteractionPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/recalculate-total-times":{"post":{"tags":["Student Progress"],"summary":"Recalculate Total Times","description":"Debug endpoint to recalculate total time for all progress records of the current student.\nThis fixes any inconsistencies between unit times and total time.","operationId":"recalculate_total_times_student_progress_recalculate_total_times_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/cleanup-duplicate-progress":{"post":{"tags":["Student Progress"],"summary":"Cleanup Duplicate Progress","description":"Debug endpoint to clean up duplicate progress records.\nKeeps only the record with the most progress data for each student-course-assignment combination.","operationId":"cleanup_duplicate_progress_student_progress_cleanup_duplicate_progress_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/holiday/log-exercise-attempt":{"post":{"tags":["Student Progress"],"summary":"Log Holiday Exercise Attempt","description":"Log a holiday exercise attempt for a student.\nUpdates StudentHolidayCourseProgress with the attempt result.\nIf status is 'passed', marks the sub-chapitre as completed.","operationId":"log_holiday_exercise_attempt_student_progress_holiday_log_exercise_attempt_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogHolidayExerciseAttemptPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/holiday/log-unit-view":{"post":{"tags":["Student Progress"],"summary":"Log Holiday Unit View","description":"Log a holiday course unit view for a student.\nUpdates StudentHolidayCourseProgress to track content engagement.","operationId":"log_holiday_unit_view_student_progress_holiday_log_unit_view_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogHolidayUnitViewPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/holiday/log-flashcard-interaction":{"post":{"tags":["Student Progress"],"summary":"Log Holiday Flashcard Interaction","description":"Log a holiday course flashcard interaction for a student.","operationId":"log_holiday_flashcard_interaction_student_progress_holiday_log_flashcard_interaction_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogHolidayFlashcardInteractionPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/holiday/log-qcm-answer":{"post":{"tags":["Student Progress"],"summary":"Log Holiday Qcm Answer","description":"Log a holiday course QCM answer for a student.","operationId":"log_holiday_qcm_answer_student_progress_holiday_log_qcm_answer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogHolidayQCMAnswerPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/holiday/log-time-spent":{"post":{"tags":["Student Progress"],"summary":"Log Holiday Time Spent","description":"Log total time spent on a holiday course sub-chapitre for a student.","operationId":"log_holiday_time_spent_student_progress_holiday_log_time_spent_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogHolidayTimeSpentPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/holiday/log-content-completion":{"post":{"tags":["Student Progress"],"summary":"Log Holiday Content Completion","description":"Log when a student completes viewing a SubChapitre's content.\nCreates a 'subchapitre_content_completed' event and updates the StudentHolidayCourseProgress\nstatus to 'content_completed' without reverting a more advanced status.","operationId":"log_holiday_content_completion_student_progress_holiday_log_content_completion_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogContentCompletionPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/holiday/log-revision-completion":{"post":{"tags":["Student Progress"],"summary":"Log Holiday Revision Completion","description":"Log when a student completes a holiday course revision session.\nCreates a 'revision_session_completed' event and tracks revision statistics.","operationId":"log_holiday_revision_completion_student_progress_holiday_log_revision_completion_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogHolidayRevisionCompletionPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/holiday/override-exercise-attempt":{"post":{"tags":["Student Progress"],"summary":"Override Holiday Exercise Attempt","description":"Override a student's holiday exercise attempt status from 'failed' or 'partial' to 'passed'.\nThis allows students to manually mark exercises as completed if they believe there was an error\nin the original assessment.","operationId":"override_holiday_exercise_attempt_student_progress_holiday_override_exercise_attempt_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverrideExerciseAttemptPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/holiday/chat-history":{"get":{"tags":["Student Progress"],"summary":"Get Holiday Chat History","description":"Fetch the conversation history for all holiday course exercises.\nOptimized to only query exercises with actual user conversations.","operationId":"get_holiday_chat_history_student_progress_holiday_chat_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/HolidayChatHistoryResponse"},"type":"array","title":"Response Get Holiday Chat History Student Progress Holiday Chat History Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/holiday/chat":{"post":{"tags":["Student Progress"],"summary":"Send Holiday Chat Message","description":"Appends the user's message to the conversation_history\nfor the given holiday course exercise doc, so we can stream later.","operationId":"send_holiday_chat_message_student_progress_holiday_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayBasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progress/holiday/chat/stream":{"get":{"tags":["Student Progress"],"summary":"Stream Holiday Chat Response","description":"Streams GPT's reply for a given holiday course exercise_id.\nWe'll send the last 10 messages from conversation_history,\nplus a system prompt built from the exercise content and solution.\nUses shared streaming utility for connection management.","operationId":"stream_holiday_chat_response_student_progress_holiday_chat_stream_get","parameters":[{"name":"exercise_id","in":"query","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student/progress/holiday/{exercise_id}/audio":{"post":{"tags":["Student Progress"],"summary":"Upload Holiday Audio","description":"Transcribe user audio and store transcript in user-specific conversation.\nUses base64 encoded content for compatibility with both web and mobile.","operationId":"upload_holiday_audio_student_progress_holiday__exercise_id__audio_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayAudioUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayBasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student/progress/holiday/{exercise_id}/conversation/reset":{"post":{"tags":["Student Progress"],"summary":"Reset Holiday Conversation","description":"Clear the user's conversation history for this holiday exercise.","operationId":"reset_holiday_conversation_student_progress_holiday__exercise_id__conversation_reset_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayBasicResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student/progress/holiday/reset-exercise-progress/{sub_chapitre_id}/{exercise_id}":{"delete":{"tags":["Student Progress"],"summary":"Reset Holiday Exercise Progress","description":"Reset all progress for a specific holiday exercise by deleting all attempts.\nThis allows the student to start fresh with this exercise.","operationId":"reset_holiday_exercise_progress_student_progress_holiday_reset_exercise_progress__sub_chapitre_id___exercise_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_chapitre_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Chapitre Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student/progress/holiday-courses/exercise/{exercise_id}/check-multimodal-solution":{"post":{"tags":["Student Progress"],"summary":"Check Multimodal Solution","description":"Single endpoint for multimodal grading with granular assessment.\nTakes exercise ID and base64 data, makes one multimodal LLM call,\ncalculates overall status, logs the full granular result to the database,\nand returns detailed results to the frontend.","operationId":"check_multimodal_solution_student_progress_holiday_courses_exercise__exercise_id__check_multimodal_solution_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__student_progress__CheckMultimodalSolutionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GranularCheckSolutionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student/progress/holiday/exercise-previous-attempt/{sub_chapitre_id}/{exercise_id}":{"get":{"tags":["Student Progress"],"summary":"Get Holiday Exercise Previous Attempt","description":"Get the most recent previous attempt details for a specific exercise.\nReturns the detailed feedback and results from the last attempt.","operationId":"get_holiday_exercise_previous_attempt_student_progress_holiday_exercise_previous_attempt__sub_chapitre_id___exercise_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_chapitre_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Chapitre Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/progress/assignment/{assignment_id}/summary":{"get":{"tags":["Teacher Progress"],"summary":"Get Assignment Progress Summary","description":"Get aggregated progress statistics for a course assignment, for every\nclass or for one of them (`class_id`).","operationId":"get_assignment_progress_summary_teacher_progress_assignment__assignment_id__summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the TeacherCourseAssignment","title":"Assignment Id"},"description":"ID of the TeacherCourseAssignment"},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict the results to one of the assignment's classes (decision D7). Omit for every class.","title":"Class Id"},"description":"Restrict the results to one of the assignment's classes (decision D7). Omit for every class."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CourseAssignmentProgressSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/progress/assignment/{assignment_id}/students":{"get":{"tags":["Teacher Progress"],"summary":"Get Assignment Student Progress List","description":"Get a list of students with their summary progress for a course\nassignment, for every class or for one of them (`class_id`). Each row\nnames the class it is counted under.","operationId":"get_assignment_student_progress_list_teacher_progress_assignment__assignment_id__students_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the TeacherCourseAssignment","title":"Assignment Id"},"description":"ID of the TeacherCourseAssignment"},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict the results to one of the assignment's classes (decision D7). Omit for every class.","title":"Class Id"},"description":"Restrict the results to one of the assignment's classes (decision D7). Omit for every class."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StudentProgressListItem"},"title":"Response Get Assignment Student Progress List Teacher Progress Assignment  Assignment Id  Students Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/progress/assignment/{assignment_id}/student/{student_id}":{"get":{"tags":["Teacher Progress"],"summary":"Get Detailed Student Progress","description":"Get detailed progress information for a specific student on a course assignment.","operationId":"get_detailed_student_progress_teacher_progress_assignment__assignment_id__student__student_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the TeacherCourseAssignment","title":"Assignment Id"},"description":"ID of the TeacherCourseAssignment"},{"name":"student_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the student","title":"Student Id"},"description":"ID of the student"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetailedStudentProgress"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/exercise-flags":{"get":{"tags":["admin_exercise_flags"],"summary":"List Exercise Flags","description":"List all exercise flags with user and exercise details.\nOnly admins can access this endpoint.","operationId":"list_exercise_flags_admin_exercise_flags_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"Maximum number of flags to return","default":50,"title":"Limit"},"description":"Maximum number of flags to return"},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","description":"Number of flags to skip","default":0,"title":"Skip"},"description":"Number of flags to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExerciseFlagWithDetails"},"title":"Response List Exercise Flags Admin Exercise Flags Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/exercise-flags/{flag_id}/status":{"put":{"tags":["admin_exercise_flags"],"summary":"Update Flag Status","description":"Update the status of an exercise flag.\nOnly admins can access this endpoint.","operationId":"update_flag_status_admin_exercise_flags__flag_id__status_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"flag_id","in":"path","required":true,"schema":{"type":"string","title":"Flag Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFlagStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/exercise-flags/stats":{"get":{"tags":["admin_exercise_flags"],"summary":"Get Flag Stats","description":"Get statistics about exercise flags.\nOnly admins can access this endpoint.","operationId":"get_flag_stats_admin_exercise_flags_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/transcription-tests/datasets":{"get":{"tags":["admin-transcription-tests"],"summary":"List Transcription Datasets","operationId":"list_transcription_datasets_admin_transcription_tests_datasets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TranscriptionDatasetSummary"},"type":"array","title":"Response List Transcription Datasets Admin Transcription Tests Datasets Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["admin-transcription-tests"],"summary":"Create Transcription Dataset","operationId":"create_transcription_dataset_admin_transcription_tests_datasets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDatasetRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionDatasetSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/transcription-tests/datasets/rename":{"post":{"tags":["admin-transcription-tests"],"summary":"Rename Transcription Dataset","operationId":"rename_transcription_dataset_admin_transcription_tests_datasets_rename_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameDatasetRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TranscriptionDatasetSummary"},"type":"array","title":"Response Rename Transcription Dataset Admin Transcription Tests Datasets Rename Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/transcription-tests/datasets/delete":{"post":{"tags":["admin-transcription-tests"],"summary":"Delete Transcription Dataset","operationId":"delete_transcription_dataset_admin_transcription_tests_datasets_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteDatasetRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TranscriptionDatasetSummary"},"type":"array","title":"Response Delete Transcription Dataset Admin Transcription Tests Datasets Delete Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/transcription-tests/datasets/sample-from-exercise-session-solutions":{"post":{"tags":["admin-transcription-tests"],"summary":"Sample Images From Exercise Session Solutions","operationId":"sample_images_from_exercise_session_solutions_admin_transcription_tests_datasets_sample_from_exercise_session_solutions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SampleFromExerciseSessionSolutionsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SampleFromExerciseSessionSolutionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/transcription-tests":{"get":{"tags":["admin-transcription-tests"],"summary":"List Transcription Tests","operationId":"list_transcription_tests_admin_transcription_tests_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"dataset","in":"query","required":false,"schema":{"type":"string","default":"default","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionTestImage"},"title":"Response List Transcription Tests Admin Transcription Tests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin-transcription-tests"],"summary":"Create Transcription Tests","operationId":"create_transcription_tests_admin_transcription_tests_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTranscriptionTestsRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionTestImage"},"title":"Response Create Transcription Tests Admin Transcription Tests Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/{image_id}/status":{"patch":{"tags":["admin-transcription-tests"],"summary":"Update Transcription Status","operationId":"update_transcription_status_admin_transcription_tests__image_id__status_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"string","title":"Image Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__admin_transcription_tests__UpdateStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionTestImage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/{image_id}":{"delete":{"tags":["admin-transcription-tests"],"summary":"Delete Transcription Test","operationId":"delete_transcription_test_admin_transcription_tests__image_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"string","title":"Image Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/{image_id}/transcribe":{"post":{"tags":["admin-transcription-tests"],"summary":"Transcribe Single Image","operationId":"transcribe_single_image_admin_transcription_tests__image_id__transcribe_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"string","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionTestImage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/{image_id}/correct":{"post":{"tags":["admin-transcription-tests"],"summary":"Correct Single Image","operationId":"correct_single_image_admin_transcription_tests__image_id__correct_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"string","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionTestImage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/transcribe-all":{"post":{"tags":["admin-transcription-tests"],"summary":"Transcribe All Images","operationId":"transcribe_all_images_admin_transcription_tests_transcribe_all_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"dataset","in":"query","required":false,"schema":{"type":"string","default":"default","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionTestImage"},"title":"Response Transcribe All Images Admin Transcription Tests Transcribe All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/correct-all":{"post":{"tags":["admin-transcription-tests"],"summary":"Correct All Images","operationId":"correct_all_images_admin_transcription_tests_correct_all_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"dataset","in":"query","required":false,"schema":{"type":"string","default":"default","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionTestImage"},"title":"Response Correct All Images Admin Transcription Tests Correct All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/correct-missing":{"post":{"tags":["admin-transcription-tests"],"summary":"Correct Missing Images","operationId":"correct_missing_images_admin_transcription_tests_correct_missing_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"dataset","in":"query","required":false,"schema":{"type":"string","default":"default","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionTestImage"},"title":"Response Correct Missing Images Admin Transcription Tests Correct Missing Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/{image_id}/ground-truth":{"patch":{"tags":["admin-transcription-tests"],"summary":"Update Ground Truth","operationId":"update_ground_truth_admin_transcription_tests__image_id__ground_truth_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"string","title":"Image Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGroundTruthRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionTestImage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/{image_id}/ground-truth/from-attempt/{attempt_index}":{"post":{"tags":["admin-transcription-tests"],"summary":"Set Ground Truth From Attempt","operationId":"set_ground_truth_from_attempt_admin_transcription_tests__image_id__ground_truth_from_attempt__attempt_index__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"string","title":"Image Id"}},{"name":"attempt_index","in":"path","required":true,"schema":{"type":"integer","title":"Attempt Index"}},{"name":"configuration","in":"query","required":false,"schema":{"anyOf":[{"enum":["no_context","content","solution","both"],"type":"string"},{"type":"null"}],"title":"Configuration"}},{"name":"attempt_type","in":"query","required":false,"schema":{"enum":["initial","corrected"],"type":"string","default":"initial","title":"Attempt Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionTestImage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/transcribe-missing":{"post":{"tags":["admin-transcription-tests"],"summary":"Transcribe Missing Images","operationId":"transcribe_missing_images_admin_transcription_tests_transcribe_missing_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"dataset","in":"query","required":false,"schema":{"type":"string","default":"default","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionTestImage"},"title":"Response Transcribe Missing Images Admin Transcription Tests Transcribe Missing Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/review-all":{"post":{"tags":["admin-transcription-tests"],"summary":"Review All Images","operationId":"review_all_images_admin_transcription_tests_review_all_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"dataset","in":"query","required":false,"schema":{"type":"string","default":"default","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionTestImage"},"title":"Response Review All Images Admin Transcription Tests Review All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/{image_id}/review":{"post":{"tags":["admin-transcription-tests"],"summary":"Review Single Image","operationId":"review_single_image_admin_transcription_tests__image_id__review_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"string","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionTestImage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/review-missing":{"post":{"tags":["admin-transcription-tests"],"summary":"Review Missing Images","operationId":"review_missing_images_admin_transcription_tests_review_missing_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"dataset","in":"query","required":false,"schema":{"type":"string","default":"default","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionTestImage"},"title":"Response Review Missing Images Admin Transcription Tests Review Missing Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/clear-status":{"post":{"tags":["admin-transcription-tests"],"summary":"Clear All Statuses","operationId":"clear_all_statuses_admin_transcription_tests_clear_status_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"dataset","in":"query","required":false,"schema":{"type":"string","default":"default","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionTestImage"},"title":"Response Clear All Statuses Admin Transcription Tests Clear Status Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/clear-transcriptions":{"post":{"tags":["admin-transcription-tests"],"summary":"Clear All Transcriptions","operationId":"clear_all_transcriptions_admin_transcription_tests_clear_transcriptions_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"dataset","in":"query","required":false,"schema":{"type":"string","default":"default","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionTestImage"},"title":"Response Clear All Transcriptions Admin Transcription Tests Clear Transcriptions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-tests/clear-corrections":{"post":{"tags":["admin-transcription-tests"],"summary":"Clear All Corrections","operationId":"clear_all_corrections_admin_transcription_tests_clear_corrections_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"dataset","in":"query","required":false,"schema":{"type":"string","default":"default","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionTestImage"},"title":"Response Clear All Corrections Admin Transcription Tests Clear Corrections Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holiday-courses/classes":{"get":{"tags":["Holiday Courses - Student"],"summary":"Get Holiday Course Classes","description":"Returns all HolidayCourseClasse, ordered by order.\nRequires student authentication.","operationId":"get_holiday_course_classes_holiday_courses_classes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/HolidayCourseClasse"},"type":"array","title":"Response Get Holiday Course Classes Holiday Courses Classes Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/holiday-courses/classes/{classe_id}/chapitres":{"get":{"tags":["Holiday Courses - Student"],"summary":"Get Chapitres For Classe","description":"Returns all HolidayCourseChapitre for the specified classe_id, ordered by order.","operationId":"get_chapitres_for_classe_holiday_courses_classes__classe_id__chapitres_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"classe_id","in":"path","required":true,"schema":{"type":"string","title":"Classe Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HolidayCourseChapitre"},"title":"Response Get Chapitres For Classe Holiday Courses Classes  Classe Id  Chapitres Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holiday-courses/chapitres/{chapitre_id}/subchapitres":{"get":{"tags":["Holiday Courses - Student"],"summary":"Get Holiday Sub Chapitres For Chapitre With Details","description":"Returns all HolidayCourseSubChapitre for the specified chapitre_id, ordered by order.\nIncludes student progress information and total exercise count for each sub-chapitre.","operationId":"get_holiday_sub_chapitres_for_chapitre_with_details_holiday_courses_chapitres__chapitre_id__subchapitres_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chapitre_id","in":"path","required":true,"schema":{"type":"string","title":"Chapitre Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SubChapitreWithDetails"},"title":"Response Get Holiday Sub Chapitres For Chapitre With Details Holiday Courses Chapitres  Chapitre Id  Subchapitres Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holiday-courses/subchapitres/{sub_chapitre_id}":{"get":{"tags":["Holiday Courses - Student"],"summary":"Get Subchapitre By Id","description":"Returns a specific HolidayCourseSubChapitre by ID with student progress information.","operationId":"get_subchapitre_by_id_holiday_courses_subchapitres__sub_chapitre_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_chapitre_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Chapitre Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubChapitreWithProgress"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holiday-courses/subchapitres/{sub_chapitre_id}/validation-exercises":{"get":{"tags":["Holiday Courses - Student"],"summary":"Get Validation Exercises For Subchapitre","description":"Returns all HolidayCourseExercises linked to the specified sub_chapitre_id,\nincluding their default status and the current student's attempt status\n(passed/failed/not_attempted) for each.\nUses aggregation pipeline to prevent N+1 query memory leaks.","operationId":"get_validation_exercises_for_subchapitre_holiday_courses_subchapitres__sub_chapitre_id__validation_exercises_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_chapitre_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Chapitre Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HolidayExerciseForStudent"},"title":"Response Get Validation Exercises For Subchapitre Holiday Courses Subchapitres  Sub Chapitre Id  Validation Exercises Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holiday-courses/exercise/{exercise_id}/transcribe-solution-audio":{"post":{"tags":["Holiday Courses - Student"],"summary":"Transcribe Holiday Exercise Audio","description":"Transcribe audio solution for a holiday exercise.","operationId":"transcribe_holiday_exercise_audio_holiday_courses_exercise__exercise_id__transcribe_solution_audio_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioTranscriptionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holiday-courses/exercise/{exercise_id}/transcribe-solution-image":{"post":{"tags":["Holiday Courses - Student"],"summary":"Transcribe Holiday Exercise Image","description":"Transcribe image solution for a holiday exercise.","operationId":"transcribe_holiday_exercise_image_holiday_courses_exercise__exercise_id__transcribe_solution_image_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageTranscriptionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holiday-courses/exercise/{exercise_id}/check-ai-solution":{"post":{"tags":["Holiday Courses - Student"],"summary":"Check Holiday Exercise Solution","description":"Check a student's transcribed solution against the official solution using AI.","operationId":"check_holiday_exercise_solution_holiday_courses_exercise__exercise_id__check_ai_solution_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holiday-courses/exercise/{exercise_id}/check-audio-solution":{"post":{"tags":["Holiday Courses - Student"],"summary":"Check Holiday Exercise Audio Solution","description":"Check a student's spoken solution against the official solution using multimodal AI.\nThis endpoint accepts base64 encoded audio, calls a multimodal LLM via Portkey to\ntranscribe and grade it in a single step, and returns the assessment.","operationId":"check_holiday_exercise_audio_solution_holiday_courses_exercise__exercise_id__check_audio_solution_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckAudioSolutionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckAudioSolutionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holiday-courses/exercise/{exercise_id}/check-image-solution":{"post":{"tags":["Holiday Courses - Student"],"summary":"Check Holiday Exercise Image Solution","description":"Check a student's handwritten solution against the official solution using multimodal AI.\nThis endpoint accepts base64 encoded image, calls a multimodal LLM via Portkey to\ntranscribe and grade it in a single step, and returns the assessment.","operationId":"check_holiday_exercise_image_solution_holiday_courses_exercise__exercise_id__check_image_solution_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckImageSolutionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckAudioSolutionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holiday-courses/classes/{classe_id}/full-structure":{"get":{"tags":["Holiday Courses - Student"],"summary":"Get Classe Full Structure","description":"Returns the complete structure for a classe: all chapitres with their sub-chapitres and progress.\nThis is optimized for the linear progression view.","operationId":"get_classe_full_structure_holiday_courses_classes__classe_id__full_structure_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"classe_id","in":"path","required":true,"schema":{"type":"string","title":"Classe Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullClasseStructure"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holiday-courses/access-status":{"get":{"tags":["Holiday Courses - Student"],"summary":"Get Holiday Course Access Status","description":"Check if the current student has full access to Holiday Course premium content.\nReturns a simple boolean indicating access status.","operationId":"get_holiday_course_access_status_holiday_courses_access_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayCourseAccessStatusResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/holiday-courses/seasonal-eligibility":{"get":{"tags":["Holiday Courses - Student"],"summary":"Get Seasonal Eligibility","description":"Return the student's seasonal holiday-course eligibility.\n\nDrives the temporary summer entry points (sidebar, mobile banner, popup) and\ntells the frontend which cahier to land the student on.","operationId":"get_seasonal_eligibility_holiday_courses_seasonal_eligibility_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeasonalEligibilityResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/holiday-courses/seasonal-tracking":{"post":{"tags":["Holiday Courses - Student"],"summary":"Track Seasonal Rollout Event","description":"Record a seasonal rollout funnel event (popup seen/clicked, banner clicked,\ncahier opened). Fire-and-forget from the frontend; feeds /admin/holiday-rollout.","operationId":"track_seasonal_rollout_event_holiday_courses_seasonal_tracking_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeasonalTrackingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/holiday-courses/exercise/{exercise_id}/check-multimodal-solution":{"post":{"tags":["Holiday Courses - Student"],"summary":"Check Holiday Exercise Multimodal Solution","description":"Check a student's multimodal solution (audio or image) against the official solution.\nReturns granular feedback question by question.","operationId":"check_holiday_exercise_multimodal_solution_holiday_courses_exercise__exercise_id__check_multimodal_solution_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__holiday_content__CheckMultimodalSolutionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckMultimodalSolutionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/programme-diagnostic/run-diagnostic":{"post":{"tags":["programme_diagnostic"],"summary":"Run Diagnostic","operationId":"run_diagnostic_programme_diagnostic_run_diagnostic_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDiagnosticRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/programme-diagnostic/results":{"get":{"tags":["programme_diagnostic"],"summary":"Get Diagnostic Results","operationId":"get_diagnostic_results_programme_diagnostic_results_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"is_relevant","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Relevant"}},{"name":"chapter_tag_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Tag Id"}},{"name":"include_dismissed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Dismissed"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DiagnosticResultOut"},"title":"Response Get Diagnostic Results Programme Diagnostic Results Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/programme-diagnostic/chapters":{"get":{"tags":["programme_diagnostic"],"summary":"Get Available Chapters","description":"List known curriculum chapters (by legacy slug) with their titles.","operationId":"get_available_chapters_programme_diagnostic_chapters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/programme-diagnostic/available-chapters":{"get":{"tags":["programme_diagnostic"],"summary":"Get Programme Available Chapters","operationId":"get_programme_available_chapters_programme_diagnostic_available_chapters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ChapterInfo"},"type":"array","title":"Response Get Programme Available Chapters Programme Diagnostic Available Chapters Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/programme-diagnostic/results/{result_id}/dismiss":{"patch":{"tags":["programme_diagnostic"],"summary":"Dismiss Diagnostic Result","operationId":"dismiss_diagnostic_result_programme_diagnostic_results__result_id__dismiss_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"result_id","in":"path","required":true,"schema":{"type":"string","title":"Result Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/holiday-courses/dashboard/{classe_id}":{"get":{"tags":["Holiday Dashboard"],"summary":"Get Holiday Dashboard","description":"Get comprehensive dashboard data for a student's holiday course progress.\n\nThis endpoint aggregates data from both StudentHolidayCourseProgress and\nHolidayCourseEvent collections to provide a complete dashboard view.","operationId":"get_holiday_dashboard_holiday_courses_dashboard__classe_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"classe_id","in":"path","required":true,"schema":{"type":"string","title":"Classe Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayDashboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/access-management/search-user":{"get":{"tags":["Admin - Access Management"],"summary":"Search User By Email","description":"Search for users by email address.\nReturns a list of matching users (simplified User objects).","operationId":"search_user_by_email_admin_access_management_search_user_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","description":"Email to search for","title":"Email"},"description":"Email to search for"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserSearchResult"},"title":"Response Search User By Email Admin Access Management Search User Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/access-management/status/{student_id}":{"get":{"tags":["Admin - Access Management"],"summary":"Get Access Status","description":"Get the holiday course access status for a specific student.\nReturns the access record if it exists, otherwise returns has_access=false.","operationId":"get_access_status_admin_access_management_status__student_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"student_id","in":"path","required":true,"schema":{"type":"string","title":"Student Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/access-management/grant/{student_id}":{"post":{"tags":["Admin - Access Management"],"summary":"Grant Access","description":"Grant full holiday course access to a student.\nCreates or updates (upserts) a HolidayCourseAccess document.","operationId":"grant_access_admin_access_management_grant__student_id__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"student_id","in":"path","required":true,"schema":{"type":"string","title":"Student Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessGrantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/access-management/revoke/{student_id}":{"delete":{"tags":["Admin - Access Management"],"summary":"Revoke Access","description":"Revoke holiday course access from a student.\nDeletes the HolidayCourseAccess document for the given student_id.","operationId":"revoke_access_admin_access_management_revoke__student_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"student_id","in":"path","required":true,"schema":{"type":"string","title":"Student Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessRevokeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/schools/":{"post":{"tags":["Admin - Schools"],"summary":"Create School","description":"Create a new school entry.\nOnly accessible by admin users.","operationId":"create_school_admin_schools__post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Admin - Schools"],"summary":"List Schools","description":"List schools with optional filtering.\nOnly accessible by admin users.","operationId":"list_schools_admin_schools__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by school name or domain","title":"Search"},"description":"Search by school name or domain"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchoolResponse"},"title":"Response List Schools Admin Schools  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/schools/{school_id}":{"put":{"tags":["Admin - Schools"],"summary":"Update School","description":"Update an existing school.\nOnly accessible by admin users.","operationId":"update_school_admin_schools__school_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school to update","title":"School Id"},"description":"The ID of the school to update"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin - Schools"],"summary":"Delete School","description":"Delete a school.\nOnly accessible by admin users.","operationId":"delete_school_admin_schools__school_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school to delete","title":"School Id"},"description":"The ID of the school to delete"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/schools/{school_id}/contracts":{"get":{"tags":["Admin - Schools"],"summary":"List School Contracts","operationId":"list_school_contracts_admin_schools__school_id__contracts_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school","title":"School Id"},"description":"The ID of the school"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchoolContractResponse"},"title":"Response List School Contracts Admin Schools  School Id  Contracts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin - Schools"],"summary":"Create School Contract","operationId":"create_school_contract_admin_schools__school_id__contracts_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school","title":"School Id"},"description":"The ID of the school"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolContractCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolContractResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/schools/{school_id}/contracts/{contract_id}":{"put":{"tags":["Admin - Schools"],"summary":"Update School Contract","operationId":"update_school_contract_admin_schools__school_id__contracts__contract_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school","title":"School Id"},"description":"The ID of the school"},{"name":"contract_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the contract","title":"Contract Id"},"description":"The ID of the contract"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolContractUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolContractResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin - Schools"],"summary":"Delete School Contract","operationId":"delete_school_contract_admin_schools__school_id__contracts__contract_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school","title":"School Id"},"description":"The ID of the school"},{"name":"contract_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the contract","title":"Contract Id"},"description":"The ID of the contract"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/schools/contract-owners":{"get":{"tags":["Admin - Schools"],"summary":"List Contract Owners","description":"Admin accounts that can own a contract.","operationId":"list_contract_owners_admin_schools_contract_owners_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AdminAccountResponse"},"type":"array","title":"Response List Contract Owners Admin Schools Contract Owners Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/schools/{school_id}/contracts/{contract_id}/gesture":{"post":{"tags":["Admin - Schools"],"summary":"Grant Contract Gesture","description":"Grant the commercial gesture: +30 days on the contract end date, once.\n\nSame button for everyone, no per-role ceiling: the guard rail is that it\nonly works once per contract. Anything beyond goes through tech, directly\nin the database.","operationId":"grant_contract_gesture_admin_schools__school_id__contracts__contract_id__gesture_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school","title":"School Id"},"description":"The ID of the school"},{"name":"contract_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the contract","title":"Contract Id"},"description":"The ID of the contract"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolContractGestureCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolContractResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/schools/{school_id}/teachers":{"get":{"tags":["Admin - Schools"],"summary":"Get School Teachers","description":"Get all teachers and admins associated with a school (by domain or membership).\nOnly accessible by admin users.","operationId":"get_school_teachers_admin_schools__school_id__teachers_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school","title":"School Id"},"description":"The ID of the school"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin - Schools"],"summary":"Add Teacher To School","description":"Create a new teacher account or add existing teacher to a school.\nIf the teacher already exists, adds them as a member.\nIf they don't exist and password is provided, creates a new account.\nOnly accessible by admin users.","operationId":"add_teacher_to_school_admin_schools__school_id__teachers_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school","title":"School Id"},"description":"The ID of the school"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTeacherToSchoolRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTeacherToSchoolResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/schools/{school_id}/students":{"get":{"tags":["Admin - Schools"],"summary":"Get School Students","description":"Get all linked students for a school by traversing the associated teachers'\nclasses. Students are grouped so each student appears at most once with all\nassociated class names.","operationId":"get_school_students_admin_schools__school_id__students_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school","title":"School Id"},"description":"The ID of the school"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolStudentsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/schools/search-teachers":{"get":{"tags":["Admin - Schools"],"summary":"Search Teachers","description":"Search for existing teachers by email or name.\nOnly accessible by admin users.","operationId":"search_teachers_admin_schools_search_teachers_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Search query (email or name)","title":"Q"},"description":"Search query (email or name)"},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"School ID to check membership","title":"School Id"},"description":"School ID to check membership"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SearchTeachersResponse"},"title":"Response Search Teachers Admin Schools Search Teachers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/schools/{school_id}/teachers/existing":{"post":{"tags":["Admin - Schools"],"summary":"Add Existing Teacher To School","description":"Add an existing teacher to a school by creating a membership.\nThe teacher keeps their original email - no email changes.\nOnly accessible by admin users.","operationId":"add_existing_teacher_to_school_admin_schools__school_id__teachers_existing_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school","title":"School Id"},"description":"The ID of the school"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddExistingTeacherRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddExistingTeacherResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/schools/{school_id}/teachers/{teacher_id}":{"delete":{"tags":["Admin - Schools"],"summary":"Remove Teacher From School","description":"Remove a teacher from a school by deactivating their membership.\nTeachers with matching email domains cannot be removed this way.\nOnly accessible by admin users.","operationId":"remove_teacher_from_school_admin_schools__school_id__teachers__teacher_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school","title":"School Id"},"description":"The ID of the school"},{"name":"teacher_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the teacher to remove","title":"Teacher Id"},"description":"The ID of the teacher to remove"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveTeacherResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/schools/{school_id}/analytics":{"get":{"tags":["Admin - Schools"],"summary":"Get School Analytics","description":"Get comprehensive analytics for a school including all teachers and classes.\nAggregates data from all teachers belonging to this school.\nOnly accessible by admin users.","operationId":"get_school_analytics_admin_schools__school_id__analytics_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school","title":"School Id"},"description":"The ID of the school"},{"name":"weeks","in":"query","required":false,"schema":{"type":"integer","default":4,"title":"Weeks"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolAnalyticsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/schools/analytics/all":{"get":{"tags":["Admin - Schools"],"summary":"Get All Schools Analytics","description":"Get aggregated analytics for all schools.\nReturns summary statistics and per-school breakdowns.\nOnly accessible by admin users.","operationId":"get_all_schools_analytics_admin_schools_analytics_all_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"weeks","in":"query","required":false,"schema":{"type":"integer","default":4,"title":"Weeks"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllSchoolsAnalyticsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/schools/export-teacher-emails":{"get":{"tags":["Admin - Schools"],"summary":"Export Teacher Emails","description":"Export teacher emails.\nFilter modes:\n- 'active': Teachers from schools with active B2B contracts\n- 'any_school': Teachers from any school (active or inactive)\n- 'all': All teachers in the system (with or without school)\nOptional contract_type filter: free, pilot, paid\nOptional usage_filter: 'any' (all), 'some' (has usage), 'none' (no usage)\nReturns preview (count + sample) or CSV download.","operationId":"export_teacher_emails_admin_schools_export_teacher_emails_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"filter_mode","in":"query","required":false,"schema":{"enum":["active","any_school","all"],"type":"string","description":"Filter mode: 'active' (active contracts only), 'any_school' (any school), 'all' (all teachers)","default":"active","title":"Filter Mode"},"description":"Filter mode: 'active' (active contracts only), 'any_school' (any school), 'all' (all teachers)"},{"name":"contract_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["free","pilot","paid"],"type":"string"},{"type":"null"}],"description":"Filter by contract type (only applies when filter_mode is 'active' or 'any_school')","title":"Contract Type"},"description":"Filter by contract type (only applies when filter_mode is 'active' or 'any_school')"},{"name":"usage_filter","in":"query","required":false,"schema":{"enum":["any","some","none"],"type":"string","description":"Filter by platform usage: 'any' (no filter), 'some' (has usage), 'none' (no usage)","default":"any","title":"Usage Filter"},"description":"Filter by platform usage: 'any' (no filter), 'some' (has usage), 'none' (no usage)"},{"name":"download","in":"query","required":false,"schema":{"type":"boolean","description":"Set to true to download CSV","default":false,"title":"Download"},"description":"Set to true to download CSV"}],"responses":{"200":{"description":"CSV file when download=true","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherEmailExportResponse"}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-approvals/to-attach":{"get":{"tags":["admin"],"summary":"List Teachers To Attach","description":"Approved teachers waiting for a B2B attachment decision.","operationId":"list_teachers_to_attach_admin_teacher_approvals_to_attach_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by email, name or establishment","title":"Search"},"description":"Search by email, name or establishment"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToAttachListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-approvals/to-attach/count":{"get":{"tags":["admin"],"summary":"Count Teachers To Attach","operationId":"count_teachers_to_attach_admin_teacher_approvals_to_attach_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/teacher-approvals/{teacher_id}/attach":{"post":{"tags":["admin"],"summary":"Attach Teacher","description":"Resolve one teacher of the « À rattacher » queue.","operationId":"attach_teacher_admin_teacher_approvals__teacher_id__attach_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"teacher_id","in":"path","required":true,"schema":{"type":"string","title":"Teacher Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/UseFrenchSchoolAction"},{"$ref":"#/components/schemas/CreateFrenchSchoolAction"},{"$ref":"#/components/schemas/CreateB2BSchoolAction"},{"$ref":"#/components/schemas/AttachToSchoolAction"},{"$ref":"#/components/schemas/IgnoreAction"}],"title":"Action"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/schools/{school_id}/invitations":{"post":{"tags":["Teacher Invitations"],"summary":"Create School Invitation","operationId":"create_school_invitation_admin_schools__school_id__invitations_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school","title":"School Id"},"description":"The ID of the school"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherInvitationCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherInvitationSendResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Business rule violated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Teacher Invitations"],"summary":"List School Invitations","operationId":"list_school_invitations_admin_schools__school_id__invitations_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the school","title":"School Id"},"description":"The ID of the school"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherInvitationListResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-invitations/{invitation_id}/resend":{"post":{"tags":["Teacher Invitations"],"summary":"Resend Invitation","operationId":"resend_invitation_admin_teacher_invitations__invitation_id__resend_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the invitation","title":"Invitation Id"},"description":"The ID of the invitation"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherInvitationSendResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Business rule violated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-invitations/{invitation_id}":{"delete":{"tags":["Teacher Invitations"],"summary":"Cancel Invitation","operationId":"cancel_invitation_admin_teacher_invitations__invitation_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the invitation","title":"Invitation Id"},"description":"The ID of the invitation"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Business rule violated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-invitations/{token}":{"get":{"tags":["Teacher Invitations"],"summary":"Get Invitation Public Info","operationId":"get_invitation_public_info_teacher_invitations__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","description":"The invitation token from the email link","title":"Token"},"description":"The invitation token from the email link"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationPublicInfoResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-invitations/{token}/accept":{"post":{"tags":["Teacher Invitations"],"summary":"Accept Invitation","operationId":"accept_invitation_teacher_invitations__token__accept_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","description":"The invitation token from the email link","title":"Token"},"description":"The invitation token from the email link"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationAcceptRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationAcceptResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Business rule violated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/school-stats":{"get":{"tags":["Admin - School Stats"],"summary":"Get School Stats","description":"Get comprehensive school statistics.\n- school_id: specific school, or omit for global view across all schools\n- school_year: format \"YYYY-YYYY\" (default: current school year)\n- period: \"all\", \"t1\", \"t2\", \"t3\", or month abbreviation (sep, oct, nov, dec, jan, feb, mar, apr, may, jun)","operationId":"get_school_stats_admin_school_stats_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"School ID, omit for global view","title":"School Id"},"description":"School ID, omit for global view"},{"name":"school_year","in":"query","required":false,"schema":{"type":"string","description":"School year (e.g., 2024-2025)","title":"School Year"},"description":"School year (e.g., 2024-2025)"},{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"Period: all, t1, t2, t3, or month (sep, oct, etc.)","default":"all","title":"Period"},"description":"Period: all, t1, t2, t3, or month (sep, oct, etc.)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/business-dashboards/finance-settings":{"get":{"tags":["Admin - Business Dashboards"],"summary":"Get Business Finance Settings","operationId":"get_business_finance_settings_admin_business_dashboards_finance_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessFinanceSettingsResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["Admin - Business Dashboards"],"summary":"Update Business Finance Settings","operationId":"update_business_finance_settings_admin_business_dashboards_finance_settings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessFinanceSettingsUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessFinanceSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/business-dashboards/growth-revenue":{"get":{"tags":["Admin - Business Dashboards"],"summary":"Get Growth Revenue Dashboard","operationId":"get_growth_revenue_dashboard_admin_business_dashboards_growth_revenue_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"weeks","in":"query","required":false,"schema":{"type":"integer","maximum":104,"minimum":4,"default":26,"title":"Weeks"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrowthRevenueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/business-dashboards/retention-usage":{"get":{"tags":["Admin - Business Dashboards"],"summary":"Get Retention Usage Dashboard","operationId":"get_retention_usage_dashboard_admin_business_dashboards_retention_usage_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"weeks","in":"query","required":false,"schema":{"type":"integer","maximum":104,"minimum":4,"default":26,"title":"Weeks"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetentionUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/business-dashboards/product-adoption":{"get":{"tags":["Admin - Business Dashboards"],"summary":"Get Product Adoption Dashboard","operationId":"get_product_adoption_dashboard_admin_business_dashboards_product_adoption_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"weeks","in":"query","required":false,"schema":{"type":"integer","maximum":104,"minimum":4,"default":26,"title":"Weeks"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductAdoptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/search/holiday-content":{"get":{"tags":["Admin - Search"],"summary":"Search Holiday Content","description":"Search for content within a holiday course classe across courses, flashcards, and QCMs.\nPerforms parallel regex queries and returns contextual search hits.","operationId":"search_holiday_content_admin_search_holiday_content_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"classe_id","in":"query","required":true,"schema":{"type":"string","description":"ID of the holiday course classe","title":"Classe Id"},"description":"ID of the holiday course classe"},{"name":"query_string","in":"query","required":true,"schema":{"type":"string","description":"Search query string","title":"Query String"},"description":"Search query string"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SearchHit"},"title":"Response Search Holiday Content Admin Search Holiday Content Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/student-beta/schools/enable":{"post":{"tags":["Admin - Student Beta"],"summary":"Enable School Beta","operationId":"enable_school_beta_admin_student_beta_schools_enable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolBetaUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentBetaUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/student-beta/schools/disable":{"post":{"tags":["Admin - Student Beta"],"summary":"Disable School Beta","operationId":"disable_school_beta_admin_student_beta_schools_disable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolBetaUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentBetaUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/student-beta/emails/enable":{"post":{"tags":["Admin - Student Beta"],"summary":"Enable Email Beta","operationId":"enable_email_beta_admin_student_beta_emails_enable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailBetaUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentBetaUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/student-beta/emails/disable":{"post":{"tags":["Admin - Student Beta"],"summary":"Disable Email Beta","operationId":"disable_email_beta_admin_student_beta_emails_disable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailBetaUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentBetaUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/school-codes":{"get":{"tags":["Admin - School Codes"],"summary":"List School Codes","description":"List all school codes.\nOnly accessible by admins.","operationId":"list_school_codes_admin_school_codes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SchoolCodeResponse"},"type":"array","title":"Response List School Codes Admin School Codes Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Admin - School Codes"],"summary":"Create School Code","description":"Create a new school access code.\nOnly accessible by admins.","operationId":"create_school_code_admin_school_codes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolCodeCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/school-codes/{code_id}":{"put":{"tags":["Admin - School Codes"],"summary":"Update School Code","description":"Update a school code.\nOnly accessible by admins.","operationId":"update_school_code_admin_school_codes__code_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"code_id","in":"path","required":true,"schema":{"type":"string","title":"Code Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolCodeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin - School Codes"],"summary":"Delete School Code","description":"Delete a school code.\nOnly accessible by admins.","operationId":"delete_school_code_admin_school_codes__code_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"code_id","in":"path","required":true,"schema":{"type":"string","title":"Code Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/school-codes/{code_id}/usage":{"get":{"tags":["Admin - School Codes"],"summary":"Get School Code Usage","description":"Get usage statistics for a specific school code.\nOnly accessible by admins.","operationId":"get_school_code_usage_admin_school_codes__code_id__usage_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"code_id","in":"path","required":true,"schema":{"type":"string","title":"Code Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchoolCodeUsageResponse"},"title":"Response Get School Code Usage Admin School Codes  Code Id  Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/school-codes/{code_id}/analytics":{"get":{"tags":["Admin - School Codes"],"summary":"Get School Code Analytics","description":"Get detailed analytics for students who used a specific school code,\nincluding their holiday course usage statistics.\nOnly accessible by admins.","operationId":"get_school_code_analytics_admin_school_codes__code_id__analytics_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"code_id","in":"path","required":true,"schema":{"type":"string","title":"Code Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolCodeAnalyticsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/use-school-code":{"post":{"tags":["School Codes"],"summary":"Use School Code","description":"Use a school code to gain access.\nAvailable to all authenticated users.","operationId":"use_school_code_use_school_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UseSchoolCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UseSchoolCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/school/my-school":{"get":{"tags":["School"],"summary":"Get My School","description":"Get the current teacher's school information.\nReturns school name if the teacher is affiliated with a school either via\nexplicit membership or, as a fallback, via email domain matching.","operationId":"get_my_school_school_my_school_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherSchoolResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/progress-dashboard/overview":{"get":{"tags":["Admin - Progress Dashboard"],"summary":"Get Dashboard Overview","description":"Get comprehensive dashboard overview with global and chapter-level statistics\nfor the Holiday Course (Cahier de Vacances) system.\n\nThis endpoint uses MongoDB aggregation pipelines to efficiently calculate:\n- Global statistics (total active students, completed sub-chapters, completion rate)\n- Chapter-level statistics (students started, average progress, difficult sub-chapters)","operationId":"get_dashboard_overview_admin_progress_dashboard_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/progress-dashboard/chapitre/{chapitre_id}/progress-details":{"get":{"tags":["Admin - Progress Dashboard"],"summary":"Get Chapitre Progress Details","description":"Get detailed progress information for all students in a specific chapter.\n\nThis endpoint provides a comprehensive view of student progress within a chapter,\nincluding individual student completion rates and sub-chapter completion counts.\n\nArgs:\n    chapitre_id: The ID of the chapter to get details for\n\nReturns:\n    ChapitreDetailResponse: Detailed progress information for all students in the chapter","operationId":"get_chapitre_progress_details_admin_progress_dashboard_chapitre__chapitre_id__progress_details_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chapitre_id","in":"path","required":true,"schema":{"type":"string","title":"Chapitre Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapitreDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/release-updates/":{"post":{"tags":["admin-release-updates"],"summary":"Create Release Update","description":"Create a new release update (Admin only)","operationId":"create_release_update_admin_release_updates__post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseUpdateCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["admin-release-updates"],"summary":"Get All Release Updates","description":"Get all release updates (Admin only) - includes unpublished updates","operationId":"get_all_release_updates_admin_release_updates__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"include_unpublished","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Unpublished"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseUpdateOut"},"title":"Response Get All Release Updates Admin Release Updates  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/release-updates/{update_id}":{"get":{"tags":["admin-release-updates"],"summary":"Get Release Update","description":"Get a specific release update by ID (Admin only)","operationId":"get_release_update_admin_release_updates__update_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"update_id","in":"path","required":true,"schema":{"type":"string","title":"Update Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin-release-updates"],"summary":"Update Release Update","description":"Update a release update (Admin only)","operationId":"update_release_update_admin_release_updates__update_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"update_id","in":"path","required":true,"schema":{"type":"string","title":"Update Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseUpdateUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin-release-updates"],"summary":"Delete Release Update","description":"Delete a release update (Admin only)","operationId":"delete_release_update_admin_release_updates__update_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"update_id","in":"path","required":true,"schema":{"type":"string","title":"Update Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/release-updates/":{"get":{"tags":["release-updates"],"summary":"Get Published Release Updates","description":"Get published release updates for teachers/users","operationId":"get_published_release_updates_release_updates__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseUpdateOut"},"title":"Response Get Published Release Updates Release Updates  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/release-updates/unseen":{"get":{"tags":["release-updates"],"summary":"Get Unseen Release Updates","description":"Get release updates that the current user hasn't seen yet","operationId":"get_unseen_release_updates_release_updates_unseen_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ReleaseUpdateOut"},"type":"array","title":"Response Get Unseen Release Updates Release Updates Unseen Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/release-updates/{update_id}/like":{"post":{"tags":["release-updates"],"summary":"Like Release Update","description":"Like a published release update as the current user.","operationId":"like_release_update_release_updates__update_id__like_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"update_id","in":"path","required":true,"schema":{"type":"string","title":"Update Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseUpdateLikeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["release-updates"],"summary":"Unlike Release Update","description":"Remove the current user's like from a published release update.","operationId":"unlike_release_update_release_updates__update_id__like_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"update_id","in":"path","required":true,"schema":{"type":"string","title":"Update Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseUpdateLikeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/release-updates/{update_id}":{"get":{"tags":["release-updates"],"summary":"Get Published Release Update","description":"Get a specific published release update by ID","operationId":"get_published_release_update_release_updates__update_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"update_id","in":"path","required":true,"schema":{"type":"string","title":"Update Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/release-updates/mark-seen":{"post":{"tags":["release-updates"],"summary":"Mark Release Updates As Seen","description":"Mark specific release updates as seen by the current user","operationId":"mark_release_updates_as_seen_release_updates_mark_seen_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkAsSeenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/tutorial-config/":{"post":{"tags":["admin-tutorial-config"],"summary":"Create Tutorial Config","description":"Create a new tutorial configuration (Admin only)","operationId":"create_tutorial_config_admin_tutorial_config__post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TutorialConfigCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TutorialConfigOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["admin-tutorial-config"],"summary":"Get All Tutorial Configs","description":"Get all tutorial configurations (Admin only)","operationId":"get_all_tutorial_configs_admin_tutorial_config__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"include_unpublished","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Unpublished"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TutorialConfigOut"},"title":"Response Get All Tutorial Configs Admin Tutorial Config  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tutorial-config/{config_id}":{"get":{"tags":["admin-tutorial-config"],"summary":"Get Tutorial Config","description":"Get a specific tutorial configuration by ID (Admin only)","operationId":"get_tutorial_config_admin_tutorial_config__config_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TutorialConfigOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin-tutorial-config"],"summary":"Update Tutorial Config","description":"Update a tutorial configuration (Admin only)","operationId":"update_tutorial_config_admin_tutorial_config__config_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TutorialConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TutorialConfigOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin-tutorial-config"],"summary":"Delete Tutorial Config","description":"Delete a tutorial configuration (Admin only)","operationId":"delete_tutorial_config_admin_tutorial_config__config_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tutorial-config/upload-video":{"post":{"tags":["admin-tutorial-config"],"summary":"Upload Tutorial Video","description":"Upload a tutorial video to S3 and return the URL","operationId":"upload_tutorial_video_admin_tutorial_config_upload_video_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__tutorial_config__FileUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/tutorial-config/seed-default":{"post":{"tags":["admin-tutorial-config"],"summary":"Seed Default Tutorial","description":"Create the default teacher tutorial configuration from hardcoded values.\nThis is useful to populate the database with the existing tutorial structure.","operationId":"seed_default_tutorial_admin_tutorial_config_seed_default_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TutorialConfigOut"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/tutorial-config/teacher":{"get":{"tags":["tutorial-config"],"summary":"Get Teacher Tutorial Config","description":"Get the published teacher tutorial configuration","operationId":"get_teacher_tutorial_config_tutorial_config_teacher_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TutorialConfigOut"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/tutorial-config/{role}":{"get":{"tags":["tutorial-config"],"summary":"Get Tutorial Config By Role","description":"Get the published tutorial configuration for a specific role","operationId":"get_tutorial_config_by_role_tutorial_config__role__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"role","in":"path","required":true,"schema":{"type":"string","title":"Role"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TutorialConfigOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/graph/generate":{"post":{"tags":["graph"],"summary":"Generate Graph","description":"Génère du code Graph Language à partir d'une requête utilisateur en français.\n\nArgs:\n    request: Contient le prompt de l'utilisateur\n    current_user: Utilisateur authentifié\n\nReturns:\n    GraphGenerationResponse: Code Graph Language généré\n\nRaises:\n    HTTPException: En cas d'erreur lors de la génération","operationId":"generate_graph_graph_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphGenerationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphGenerationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/graph/edit":{"post":{"tags":["graph"],"summary":"Edit Graph","description":"Édite un graphique existant à partir d'une demande de modification.\n\nArgs:\n    request: Contient le code Graph Language actuel et la demande de modification\n    current_user: Utilisateur authentifié\n\nReturns:\n    GraphGenerationResponse: Code Graph Language modifié\n\nRaises:\n    HTTPException: En cas d'erreur lors de l'édition","operationId":"edit_graph_graph_edit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphEditRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphGenerationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/schools/search":{"get":{"tags":["schools"],"summary":"Search Schools","description":"Search for schools by name, postal code, or region.\nReturns schools that match the query string in any of these fields.","operationId":"search_schools_schools_search_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","title":"Query"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchoolSearchResponse"},"title":"Response Search Schools Schools Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/schools/admin/upload":{"post":{"tags":["schools"],"summary":"Upload Schools Csv","description":"Admin-only route to upload a CSV file containing French schools data.\nRows are upserted by UAI (existing entries keep their id and B2B link).\n\nExpected CSV columns:\n- UAI: School unique identifier\n- Etablissement: School name\n- Region: Region name\n- Code commune: Postal code\n- Commune: City name","operationId":"upload_schools_csv_schools_admin_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_schools_csv_schools_admin_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/schools/admin/count":{"get":{"tags":["schools"],"summary":"Get Schools Count","description":"Admin route to get the total number of schools in the database.","operationId":"get_schools_count_schools_admin_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/schools/admin/search":{"get":{"tags":["schools"],"summary":"Admin Search Schools","description":"Admin route to search for schools with pagination.\nIf query is empty, returns all schools with pagination.","operationId":"admin_search_schools_schools_admin_search_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"query","in":"query","required":false,"schema":{"type":"string","default":"","title":"Query"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchoolSearchResponse"},"title":"Response Admin Search Schools Schools Admin Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/schools/admin/{school_id}":{"put":{"tags":["schools"],"summary":"Update French School","description":"Admin route to update a French school's information.","operationId":"update_french_school_schools_admin__school_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_id","in":"path","required":true,"schema":{"type":"string","title":"School Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrenchSchoolUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchoolSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher-access/status":{"get":{"tags":["Teacher Access"],"summary":"Get Access Status","description":"Return the B2B access status for the authenticated teacher.\n\nDeliberately depends on get_current_user (not get_current_teacher): the\nfrontend uses this to decide whether to show the countdown banner or the\nread-only strip, so it must answer for read-only accounts too.","operationId":"get_access_status_teacher_access_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherAccessStatusResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/onboarding-cockpit/summary":{"get":{"tags":["admin_onboarding"],"summary":"Get Onboarding Summary","operationId":"get_onboarding_summary_admin_onboarding_cockpit_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"role","in":"query","required":false,"schema":{"type":"string","description":"all | student | teacher","default":"all","title":"Role"},"description":"all | student | teacher"},{"name":"device","in":"query","required":false,"schema":{"type":"string","description":"all | desktop_web | mobile_web | ios_native | android_native","default":"all","title":"Device"},"description":"all | desktop_web | mobile_web | ios_native | android_native"},{"name":"activation_window_days","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":7,"title":"Activation Window Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/onboarding-cockpit/teacher-verification":{"get":{"tags":["admin_onboarding"],"summary":"Get Teacher Verification Overview","description":"Academic-email verification status of teachers registered in the window.\n\nPer-teacher status:\n- verified: clicked the magic link (auto-approved)\n- email_sent: verification email sent, link not clicked yet\n- no_academic_email: left a \"je n'ai pas d'adresse académique\" message\n- none: reached (or not) the verification step without acting","operationId":"get_teacher_verification_overview_admin_onboarding_cockpit_teacher_verification_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/onboarding-cockpit/funnel":{"get":{"tags":["admin_onboarding"],"summary":"Get Onboarding Funnel","operationId":"get_onboarding_funnel_admin_onboarding_cockpit_funnel_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"role","in":"query","required":false,"schema":{"type":"string","description":"student | teacher","default":"student","title":"Role"},"description":"student | teacher"},{"name":"device","in":"query","required":false,"schema":{"type":"string","description":"all | desktop_web | mobile_web | ios_native | android_native","default":"all","title":"Device"},"description":"all | desktop_web | mobile_web | ios_native | android_native"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/tracking/anonymous":{"post":{"tags":["Onboarding"],"summary":"Track Anonymous Onboarding Event","description":"Track pre-signup onboarding steps before a user exists.\nFrontend sends a stable onboarding_session_id (UUID) stored client-side.","operationId":"track_anonymous_onboarding_event_onboarding_tracking_anonymous_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousEvent"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transcription-metrics/latency":{"post":{"tags":["transcription_metrics"],"summary":"Track Transcription Latency","operationId":"track_transcription_latency_transcription_metrics_latency_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionLatencyPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/transcription-metrics/teacher/latency":{"post":{"tags":["transcription_metrics"],"summary":"Track Teacher Transcription Latency","operationId":"track_teacher_transcription_latency_transcription_metrics_teacher_latency_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeacherTranscriptionLatencyPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/transcription-metrics/edit-log":{"post":{"tags":["transcription_metrics"],"summary":"Log Transcription Edit","operationId":"log_transcription_edit_transcription_metrics_edit_log_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionEditPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/transcription-metrics/summary":{"get":{"tags":["admin_transcription_metrics"],"summary":"Get Transcription Metrics Summary","operationId":"get_transcription_metrics_summary_admin_transcription_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"role","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Role"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"has_figures","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Figures"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-metrics/reviews":{"get":{"tags":["admin_transcription_metrics"],"summary":"Get Transcription Reviews","operationId":"get_transcription_reviews_admin_transcription_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"role","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Role"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"has_figures","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Figures"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionReviewItem"},"title":"Response Get Transcription Reviews Admin Transcription Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-metrics/correction-summary":{"get":{"tags":["admin_transcription_metrics"],"summary":"Get Transcription Correction Metrics Summary","operationId":"get_transcription_correction_metrics_summary_admin_transcription_metrics_correction_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"suggestion_type","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Suggestion Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionCorrectionMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcription-metrics/correction-reviews":{"get":{"tags":["admin_transcription_metrics"],"summary":"Get Transcription Correction Reviews","operationId":"get_transcription_correction_reviews_admin_transcription_metrics_correction_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"suggestion_type","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Suggestion Type"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TranscriptionCorrectionReviewItem"},"title":"Response Get Transcription Correction Reviews Admin Transcription Metrics Correction Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/assignment-metrics/summary":{"get":{"tags":["admin_assignment_metrics"],"summary":"Get Assignment Metrics Summary","description":"Get aggregated assignment metrics for a specific month.","operationId":"get_assignment_metrics_summary_admin_assignment_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":1,"title":"Month"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by school/établissement","title":"School Id"},"description":"Filter by school/établissement"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignmentMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/assignment-metrics/csat-details":{"get":{"tags":["admin_assignment_metrics"],"summary":"Get Csat Details","description":"Get detailed CSAT ratings with user information.","operationId":"get_csat_details_admin_assignment_metrics_csat_details_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":1,"title":"Month"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by school/établissement","title":"School Id"},"description":"Filter by school/établissement"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CSATDetailItem"},"title":"Response Get Csat Details Admin Assignment Metrics Csat Details Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/assignment-metrics/status-details":{"get":{"tags":["admin_assignment_metrics"],"summary":"Get Status Details","description":"Get detailed assignment list filtered by status.","operationId":"get_status_details_admin_assignment_metrics_status_details_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":1,"title":"Month"}},{"name":"status","in":"query","required":true,"schema":{"type":"string","description":"Filter by status: draft, active, or finished","title":"Status"},"description":"Filter by status: draft, active, or finished"},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by school/établissement","title":"School Id"},"description":"Filter by school/établissement"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StatusDetailItem"},"title":"Response Get Status Details Admin Assignment Metrics Status Details Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/assignment-metrics/class-attribution-details":{"get":{"tags":["admin_assignment_metrics"],"summary":"Get Class Attribution Details","description":"Get detailed assignment list filtered by number of classes assigned.","operationId":"get_class_attribution_details_admin_assignment_metrics_class_attribution_details_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":1,"title":"Month"}},{"name":"class_count","in":"query","required":true,"schema":{"type":"string","description":"Filter by class count: 0, 1, or 2+","title":"Class Count"},"description":"Filter by class count: 0, 1, or 2+"},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by school/établissement","title":"School Id"},"description":"Filter by school/établissement"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClassAttributionDetailItem"},"title":"Response Get Class Attribution Details Admin Assignment Metrics Class Attribution Details Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/assignment-metrics/exercise-type-details":{"get":{"tags":["admin_assignment_metrics"],"summary":"Get Exercise Type Details","description":"Get detailed exercise list filtered by type.","operationId":"get_exercise_type_details_admin_assignment_metrics_exercise_type_details_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":1,"title":"Month"}},{"name":"exercise_type","in":"query","required":true,"schema":{"type":"string","description":"Filter by type: Cours, Calcul, or Reflexion","title":"Exercise Type"},"description":"Filter by type: Cours, Calcul, or Reflexion"},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by school/établissement","title":"School Id"},"description":"Filter by school/établissement"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExerciseTypeDetailItem"},"title":"Response Get Exercise Type Details Admin Assignment Metrics Exercise Type Details Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/csat/prompt":{"post":{"tags":["csat"],"summary":"Get Csat Prompt State","description":"Check if user should see CSAT prompt for given type.\nUpdates visit counters and returns whether to show prompt.","operationId":"get_csat_prompt_state_csat_prompt_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CSATPromptRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CSATPromptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/csat/feedback":{"post":{"tags":["csat"],"summary":"Submit Csat Feedback","description":"Submit CSAT feedback for any type.","operationId":"submit_csat_feedback_csat_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CSATFeedbackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CSATFeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/csat/category":{"post":{"tags":["csat"],"summary":"Update Csat Category","description":"Update category on existing feedback with ownership check.","operationId":"update_csat_category_csat_category_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CSATCategoryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/correction-metrics/summary":{"get":{"tags":["admin_correction_metrics"],"summary":"Get Correction Metrics Summary","description":"Get summary of correction CSAT metrics.","operationId":"get_correction_metrics_summary_admin_correction_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/correction-metrics/reviews":{"get":{"tags":["admin_correction_metrics"],"summary":"Get Correction Reviews","description":"Get paginated list of correction CSAT reviews.","operationId":"get_correction_reviews_admin_correction_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CorrectionReviewItem"},"title":"Response Get Correction Reviews Admin Correction Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/home-redesign-metrics/summary":{"get":{"tags":["admin_home_redesign_metrics"],"summary":"Get Home Redesign Metrics Summary","operationId":"get_home_redesign_metrics_summary_admin_home_redesign_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HomeRedesignMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/home-redesign-metrics/reviews":{"get":{"tags":["admin_home_redesign_metrics"],"summary":"Get Home Redesign Reviews","operationId":"get_home_redesign_reviews_admin_home_redesign_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HomeRedesignReviewItem"},"title":"Response Get Home Redesign Reviews Admin Home Redesign Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/chat-redesign-metrics/summary":{"get":{"tags":["admin_chat_redesign_metrics"],"summary":"Get Chat Redesign Metrics Summary","operationId":"get_chat_redesign_metrics_summary_admin_chat_redesign_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRedesignMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/chat-redesign-metrics/reviews":{"get":{"tags":["admin_chat_redesign_metrics"],"summary":"Get Chat Redesign Reviews","operationId":"get_chat_redesign_reviews_admin_chat_redesign_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChatRedesignReviewItem"},"title":"Response Get Chat Redesign Reviews Admin Chat Redesign Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/physics-library-metrics/summary":{"get":{"tags":["admin_physics_library_metrics"],"summary":"Get Physics Library Metrics Summary","operationId":"get_physics_library_metrics_summary_admin_physics_library_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"surface","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Surface"}},{"name":"action","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Action"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhysicsLibraryMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/physics-library-metrics/reviews":{"get":{"tags":["admin_physics_library_metrics"],"summary":"Get Physics Library Reviews","operationId":"get_physics_library_reviews_admin_physics_library_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"surface","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Surface"}},{"name":"action","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Action"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PhysicsLibraryReviewItem"},"title":"Response Get Physics Library Reviews Admin Physics Library Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mobile-toolbar-redesign-metrics/behavior-summary":{"get":{"tags":["admin_mobile_toolbar_redesign_metrics"],"summary":"Get Mobile Toolbar Redesign Behavior Summary","operationId":"get_mobile_toolbar_redesign_behavior_summary_admin_mobile_toolbar_redesign_metrics_behavior_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"current_start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Current Start"}},{"name":"current_end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Current End"}},{"name":"baseline_start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Baseline Start"}},{"name":"baseline_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Baseline End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileToolbarBehaviorSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mobile-toolbar-redesign-metrics/experiment-summary":{"get":{"tags":["admin_mobile_toolbar_redesign_metrics"],"summary":"Get Mobile Toolbar Redesign Experiment Summary","operationId":"get_mobile_toolbar_redesign_experiment_summary_admin_mobile_toolbar_redesign_metrics_experiment_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"current_start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Current Start"}},{"name":"current_end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Current End"}},{"name":"baseline_start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Baseline Start"}},{"name":"baseline_end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Baseline End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileToolbarExperimentSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mobile-toolbar-redesign-metrics/summary":{"get":{"tags":["admin_mobile_toolbar_redesign_metrics"],"summary":"Get Mobile Toolbar Redesign Metrics Summary","operationId":"get_mobile_toolbar_redesign_metrics_summary_admin_mobile_toolbar_redesign_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileToolbarRedesignMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mobile-toolbar-redesign-metrics/reviews":{"get":{"tags":["admin_mobile_toolbar_redesign_metrics"],"summary":"Get Mobile Toolbar Redesign Reviews","operationId":"get_mobile_toolbar_redesign_reviews_admin_mobile_toolbar_redesign_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MobileToolbarRedesignReviewItem"},"title":"Response Get Mobile Toolbar Redesign Reviews Admin Mobile Toolbar Redesign Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/chat-message-satisfaction-metrics/summary":{"get":{"tags":["admin_chat_message_satisfaction_metrics"],"summary":"Get Chat Message Satisfaction Summary","operationId":"get_chat_message_satisfaction_summary_admin_chat_message_satisfaction_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatMessageSatisfactionSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/chat-message-satisfaction-metrics/reviews":{"get":{"tags":["admin_chat_message_satisfaction_metrics"],"summary":"Get Chat Message Satisfaction Reviews","operationId":"get_chat_message_satisfaction_reviews_admin_chat_message_satisfaction_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChatMessageReviewItem"},"title":"Response Get Chat Message Satisfaction Reviews Admin Chat Message Satisfaction Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/chat-audio":{"get":{"tags":["admin_chat_audio"],"summary":"List Chat Audio Messages","operationId":"list_chat_audio_messages_admin_chat_audio_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatAudioPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/chat-tool-calls/summary":{"get":{"tags":["admin_chat_tool_calls"],"summary":"Get Tool Calls Summary","operationId":"get_tool_calls_summary_admin_chat_tool_calls_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"tool","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool"}},{"name":"surface","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"origin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}},{"name":"user_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolCallSummaryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/chat-tool-calls/events":{"get":{"tags":["admin_chat_tool_calls"],"summary":"List Tool Call Events","operationId":"list_tool_call_events_admin_chat_tool_calls_events_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"tool","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool"}},{"name":"surface","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"origin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}},{"name":"user_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"chat_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":25,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolCallEventsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/chat-tool-calls/events/{event_id}":{"get":{"tags":["admin_chat_tool_calls"],"summary":"Get Tool Call Event","operationId":"get_tool_call_event_admin_chat_tool_calls_events__event_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolCallEventDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/chat-tool-calls/widgets/summary":{"get":{"tags":["admin_chat_tool_calls"],"summary":"Get Widgets Summary","operationId":"get_widgets_summary_admin_chat_tool_calls_widgets_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"widget","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Widget"}},{"name":"surface","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"}},{"name":"origin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}},{"name":"user_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetSummaryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/chat-tool-calls/widgets/events":{"get":{"tags":["admin_chat_tool_calls"],"summary":"List Widget Events","operationId":"list_widget_events_admin_chat_tool_calls_widgets_events_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"widget","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Widget"}},{"name":"surface","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"}},{"name":"origin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}},{"name":"user_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"chat_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id"}},{"name":"closed","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Closed"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":25,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetEventsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/chat-tool-calls/widgets/events/{event_id}":{"get":{"tags":["admin_chat_tool_calls"],"summary":"Get Widget Event","operationId":"get_widget_event_admin_chat_tool_calls_widgets_events__event_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetEventDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/chat-tool-calls/widgets/backfill":{"post":{"tags":["admin_chat_tool_calls"],"summary":"Backfill Widgets","description":"Replay assistant messages of recently updated chats into\n`chat_widget_events` (idempotent). Runs in the background.","operationId":"backfill_widgets_admin_chat_tool_calls_widgets_backfill_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":90,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetBackfillOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/chat-tool-calls/chats/{chat_id}":{"get":{"tags":["admin_chat_tool_calls"],"summary":"Get Chat Transcript","operationId":"get_chat_transcript_admin_chat_tool_calls_chats__chat_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatTranscriptOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/multimodal-submissions/summary":{"get":{"tags":["admin_multimodal_submissions"],"summary":"Get Summary","operationId":"get_summary_admin_multimodal_submissions_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultimodalSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/multimodal-submissions/attempts":{"get":{"tags":["admin_multimodal_submissions"],"summary":"List Attempts","operationId":"list_attempts_admin_multimodal_submissions_attempts_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"enum":["exercise","session"],"type":"string"},{"type":"null"}],"title":"Scope"}},{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttemptsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/student-copy-viewing-metrics/summary":{"get":{"tags":["admin_student_copy_viewing_metrics"],"summary":"Get Student Copy Viewing Metrics Summary","description":"Get summary of student copy viewing CSAT metrics.","operationId":"get_student_copy_viewing_metrics_summary_admin_student_copy_viewing_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentCopyViewingMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/student-copy-viewing-metrics/reviews":{"get":{"tags":["admin_student_copy_viewing_metrics"],"summary":"Get Student Copy Viewing Reviews","description":"Get paginated list of student copy viewing CSAT reviews.","operationId":"get_student_copy_viewing_reviews_admin_student_copy_viewing_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StudentCopyViewingReviewItem"},"title":"Response Get Student Copy Viewing Reviews Admin Student Copy Viewing Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/student-dm-results-v25-metrics/summary":{"get":{"tags":["admin_student_dm_results_v25_metrics"],"summary":"Get Summary","operationId":"get_summary_admin_student_dm_results_v25_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsatMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/student-dm-results-v25-metrics/reviews":{"get":{"tags":["admin_student_dm_results_v25_metrics"],"summary":"Get Reviews","operationId":"get_reviews_admin_student_dm_results_v25_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/routers___csat_metrics_shared__CsatReviewItem"},"title":"Response Get Reviews Admin Student Dm Results V25 Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/student-answer-submission-v25-metrics/summary":{"get":{"tags":["admin_student_answer_submission_v25_metrics"],"summary":"Get Summary","operationId":"get_summary_admin_student_answer_submission_v25_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsatMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/student-answer-submission-v25-metrics/reviews":{"get":{"tags":["admin_student_answer_submission_v25_metrics"],"summary":"Get Reviews","operationId":"get_reviews_admin_student_answer_submission_v25_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/routers___csat_metrics_shared__CsatReviewItem"},"title":"Response Get Reviews Admin Student Answer Submission V25 Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-dm-results-v25-metrics/summary":{"get":{"tags":["admin_teacher_dm_results_v25_metrics"],"summary":"Get Summary","operationId":"get_summary_admin_teacher_dm_results_v25_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsatMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/teacher-dm-results-v25-metrics/reviews":{"get":{"tags":["admin_teacher_dm_results_v25_metrics"],"summary":"Get Reviews","operationId":"get_reviews_admin_teacher_dm_results_v25_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/routers___csat_metrics_shared__CsatReviewItem"},"title":"Response Get Reviews Admin Teacher Dm Results V25 Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/figure-generation-metrics/summary":{"get":{"tags":["admin_figure_generation_metrics"],"summary":"Get Figure Generation Summary","description":"Get summary of figure-generation satisfaction metrics.","operationId":"get_figure_generation_summary_admin_figure_generation_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FigureGenerationMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/figure-generation-metrics/reviews":{"get":{"tags":["admin_figure_generation_metrics"],"summary":"Get Figure Generation Reviews","description":"Get paginated list of figure-generation satisfaction reviews.","operationId":"get_figure_generation_reviews_admin_figure_generation_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FigureGenerationReviewItem"},"title":"Response Get Figure Generation Reviews Admin Figure Generation Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/student-practice-picker-metrics/summary":{"get":{"tags":["admin_student_practice_picker_metrics"],"summary":"Get Student Practice Picker Metrics Summary","operationId":"get_student_practice_picker_metrics_summary_admin_student_practice_picker_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentPracticePickerMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/student-practice-picker-metrics/reviews":{"get":{"tags":["admin_student_practice_picker_metrics"],"summary":"Get Student Practice Picker Reviews","operationId":"get_student_practice_picker_reviews_admin_student_practice_picker_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StudentPracticePickerReviewItem"},"title":"Response Get Student Practice Picker Reviews Admin Student Practice Picker Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/student-progression-metrics/summary":{"get":{"tags":["admin_student_progression_metrics"],"summary":"Get Summary","operationId":"get_summary_admin_student_progression_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsatMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/student-progression-metrics/reviews":{"get":{"tags":["admin_student_progression_metrics"],"summary":"Get Reviews","operationId":"get_reviews_admin_student_progression_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End"}},{"name":"device","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Device"}},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},{"name":"rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating"}},{"name":"rating_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Rating Max"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/routers___csat_metrics_shared__CsatReviewItem"},"title":"Response Get Reviews Admin Student Progression Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/notification-metrics/summary":{"get":{"tags":["admin_notification_metrics"],"summary":"Get Notification Summary","description":"Get aggregated notification metrics for a date range.","operationId":"get_notification_summary_admin_notification_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","description":"Start date ISO8601","title":"Start"},"description":"Start date ISO8601"},{"name":"end","in":"query","required":true,"schema":{"type":"string","description":"End date ISO8601","title":"End"},"description":"End date ISO8601"},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/notification-metrics/timeline":{"get":{"tags":["admin_notification_metrics"],"summary":"Get Notification Timeline","description":"Get notification counts over time.","operationId":"get_notification_timeline_admin_notification_metrics_timeline_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","description":"Start date ISO8601","title":"Start"},"description":"Start date ISO8601"},{"name":"end","in":"query","required":true,"schema":{"type":"string","description":"End date ISO8601","title":"End"},"description":"End date ISO8601"},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"granularity","in":"query","required":false,"schema":{"type":"string","description":"day or week","default":"day","title":"Granularity"},"description":"day or week"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/notification-metrics/logs":{"get":{"tags":["admin_notification_metrics"],"summary":"Get Notification Logs","description":"Get paginated notification logs.","operationId":"get_notification_logs_admin_notification_metrics_logs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","description":"Start date ISO8601","title":"Start"},"description":"Start date ISO8601"},{"name":"end","in":"query","required":true,"schema":{"type":"string","description":"End date ISO8601","title":"End"},"description":"End date ISO8601"},{"name":"school_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/batch-upload-metrics/track":{"post":{"tags":["batch_upload_metrics"],"summary":"Track Batch Upload","description":"Record a batch upload event for analytics.","operationId":"track_batch_upload_batch_upload_metrics_track_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchUploadTrackPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/batch-upload-metrics/summary":{"get":{"tags":["admin_batch_upload_metrics"],"summary":"Get Batch Upload Metrics Summary","description":"Get aggregated batch upload metrics.","operationId":"get_batch_upload_metrics_summary_admin_batch_upload_metrics_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","description":"ISO8601 start date","title":"Start"},"description":"ISO8601 start date"},{"name":"end","in":"query","required":true,"schema":{"type":"string","description":"ISO8601 end date","title":"End"},"description":"ISO8601 end date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchUploadMetricsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/batch-upload-metrics/reviews":{"get":{"tags":["admin_batch_upload_metrics"],"summary":"Get Batch Upload Reviews","description":"Get paginated list of batch upload feedback.","operationId":"get_batch_upload_reviews_admin_batch_upload_metrics_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","description":"ISO8601 start date","title":"Start"},"description":"ISO8601 start date"},{"name":"end","in":"query","required":true,"schema":{"type":"string","description":"ISO8601 end date","title":"End"},"description":"ISO8601 end date"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BatchUploadReviewItem"},"title":"Response Get Batch Upload Reviews Admin Batch Upload Metrics Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/exercise-stats":{"get":{"tags":["Admin - Exercise Stats"],"summary":"Get Exercise Stats","description":"Get cached exercise completion analytics.\nReturns None for stats if no cached data exists.","operationId":"get_exercise_stats_admin_exercise_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__admin_exercise_stats__ExerciseStatsResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/exercise-stats/recompute":{"post":{"tags":["Admin - Exercise Stats"],"summary":"Recompute Exercise Stats","description":"Trigger recomputation of exercise completion analytics.\nRuns in background to avoid timeout.","operationId":"recompute_exercise_stats_admin_exercise_stats_recompute_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecomputeResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/exercise-review/tags":{"get":{"tags":["admin_exercise_review"],"summary":"List Review Tags","description":"List review tags, optionally filtered by comma-separated exercise_ids.","operationId":"list_review_tags_admin_exercise_review_tags_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReviewTagOut"},"title":"Response List Review Tags Admin Exercise Review Tags Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/exercise-review/tag/{exercise_id}":{"put":{"tags":["admin_exercise_review"],"summary":"Upsert Review Tag","description":"Create or update a review tag for an exercise.","operationId":"upsert_review_tag_admin_exercise_review_tag__exercise_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetReviewTagRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewTagOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin_exercise_review"],"summary":"Delete Review Tag","description":"Remove a review tag for an exercise.","operationId":"delete_review_tag_admin_exercise_review_tag__exercise_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Review Tag Admin Exercise Review Tag  Exercise Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/exercise-review/stats":{"get":{"tags":["admin_exercise_review"],"summary":"Get Review Stats","description":"Get aggregate counts by review status.","operationId":"get_review_stats_admin_exercise_review_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewStatsOut"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/calcul-exercises/import":{"post":{"tags":["Calcul Exercises"],"summary":"Import Templates","description":"Import multiple templates with their variations from JSON.\nAdmin only.\n\nExpected JSON format:\n{\n    \"templates\": [\n        {\n            \"title\": \"Addition Niveau 1\",\n            \"category_path\": [\"6e\", \"Calcul\"],\n            \"difficulty\": \"easy\",\n            \"variations\": [\n                {\"content\": \"1+1\", \"solution\": \"2\"},\n                {\"content\": \"2+2\", \"solution\": \"4\"}\n            ]\n        }\n    ]\n}","operationId":"import_templates_calcul_exercises_import_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/calcul-exercises/template":{"post":{"tags":["Calcul Exercises"],"summary":"Create Template","description":"Create a single template manually.\nAdmin only.","operationId":"create_template_calcul_exercises_template_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateInput"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/calcul-exercises/template/{template_id}/variation":{"post":{"tags":["Calcul Exercises"],"summary":"Create Variation","description":"Add a single variation to an existing template.\nAdmin only.","operationId":"create_variation_calcul_exercises_template__template_id__variation_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariationInput"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calcul-exercises/tree":{"get":{"tags":["Calcul Exercises"],"summary":"Get Template Tree","description":"Get all templates in a tree structure for display in the teacher's exercise selector.\nIncludes one example variation content for preview.","operationId":"get_template_tree_calcul_exercises_tree_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TemplateTreeNode"},"type":"array","title":"Response Get Template Tree Calcul Exercises Tree Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/calcul-exercises/categories":{"get":{"tags":["Calcul Exercises"],"summary":"Get Categories","description":"Get category tree structure with template counts.\nLightweight - only returns category hierarchy, not templates.\nBy default excludes templates marked as to_review (for teacher-facing views).","operationId":"get_categories_calcul_exercises_categories_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exclude_to_review","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Exclude To Review"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calcul-exercises/templates-by-category":{"get":{"tags":["Calcul Exercises"],"summary":"Get Templates By Category","description":"Get templates for a specific category path.\nLightweight - returns template summaries without example content.\nUses strict prefix matching - category_path must START with the given path.","operationId":"get_templates_by_category_calcul_exercises_templates_by_category_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"category","in":"query","required":true,"schema":{"type":"string","title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TemplateSummary"},"title":"Response Get Templates By Category Calcul Exercises Templates By Category Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calcul-exercises/template/{template_id}/example":{"get":{"tags":["Calcul Exercises"],"summary":"Get Template Example","description":"Get one example variation for a template.\nUsed for lazy loading preview content.","operationId":"get_template_example_calcul_exercises_template__template_id__example_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calcul-exercises/template/{template_id}":{"get":{"tags":["Calcul Exercises"],"summary":"Get Template","description":"Get a single template by ID with its variations.\nAdmin only.","operationId":"get_template_calcul_exercises_template__template_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Calcul Exercises"],"summary":"Delete Template","description":"Delete a template and all its variations.\nAdmin only.","operationId":"delete_template_calcul_exercises_template__template_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calcul-exercises/template/{template_id}/update":{"patch":{"tags":["Calcul Exercises"],"summary":"Update Template","description":"Update a template's title, category_path, or difficulty.\nAdmin only.","operationId":"update_template_calcul_exercises_template__template_id__update_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateUpdateInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calcul-exercises/templates":{"get":{"tags":["Calcul Exercises"],"summary":"List Templates","description":"List all templates (admin view with full details).\nAdmin only.","operationId":"list_templates_calcul_exercises_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TemplateTreeNode"},"type":"array","title":"Response List Templates Calcul Exercises Templates Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/calcul-exercises/move-category":{"post":{"tags":["Calcul Exercises"],"summary":"Move Category","description":"Move all templates from one category to another.\nUpdates category_path for all templates that start with source_path.\nAdmin only.\n\nExample:\n- source_path: [\"4e\", \"A TRIER\"]\n- destination_path: [\"4e\", \"Calcul\"]\n\nAll templates with category_path starting with [\"4e\", \"A TRIER\", ...]\nwill be moved to [\"4e\", \"Calcul\", ...]","operationId":"move_category_calcul_exercises_move_category_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__calcul_exercises__MoveCategoryInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/calcul-exercises/rename-category":{"post":{"tags":["Calcul Exercises"],"summary":"Rename Category","description":"Rename a category (folder).\nUpdates category_path for all templates that start with the given path.\nAdmin only.\n\nExample:\n- category_path: [\"4e\", \"Calcul\"]\n- new_name: \"Calcul Mental\"\n\nAll templates with category_path starting with [\"4e\", \"Calcul\", ...]\nwill be renamed to [\"4e\", \"Calcul Mental\", ...]","operationId":"rename_category_calcul_exercises_rename_category_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__calcul_exercises__RenameCategoryInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/calcul-exercises/delete-category":{"post":{"tags":["Calcul Exercises"],"summary":"Delete Category","description":"Delete a category and all its templates.\nDeletes all templates that start with the given category path.\nAdmin only.\n\nWARNING: This permanently deletes all templates and variations in the category!","operationId":"delete_category_calcul_exercises_delete_category_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteCategoryInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/calcul-exercises/template/{template_id}/variations":{"get":{"tags":["Calcul Exercises"],"summary":"Get Template Variations","description":"Get all variations for a template (for teacher preview).\nTeachers can access this to preview variations before adding to assignment.","operationId":"get_template_variations_calcul_exercises_template__template_id__variations_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VariationPreview"},"title":"Response Get Template Variations Calcul Exercises Template  Template Id  Variations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calcul-exercises/ai-review/preview":{"post":{"tags":["Calcul Exercises"],"summary":"Preview Ai Review","description":"Preview AI review operation - shows how many exercises will be reviewed.","operationId":"preview_ai_review_calcul_exercises_ai_review_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIReviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIReviewPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/calcul-exercises/ai-review/execute":{"post":{"tags":["Calcul Exercises"],"summary":"Execute Ai Review","description":"Execute AI review on all exercises in the specified category.\nUses concurrent processing with up to 10 parallel workers.\nThe AI checks:\n- Self-sufficiency: Is the exercise statement understandable without the title?\n- LaTeX formatting: Does it use proper LaTeX?\n- Mathematical validity: Are questions and answers correct?\n- Suitability for drill format: Can it be declined into repetitive variations?","operationId":"execute_ai_review_calcul_exercises_ai_review_execute_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIReviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIReviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/calcul-exercises/change-requests":{"get":{"tags":["Calcul Exercises"],"summary":"List Change Requests","description":"List all templates with pending change requests.\nOptionally filter by category path (comma-separated).","operationId":"list_change_requests_calcul_exercises_change_requests_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"category_path","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeRequestListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calcul-exercises/change-requests/{template_id}/resolve":{"post":{"tags":["Calcul Exercises"],"summary":"Resolve Change Request","description":"Resolve a change request by either applying or rejecting the proposed changes.","operationId":"resolve_change_request_calcul_exercises_change_requests__template_id__resolve_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyChangeRequestInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/correction-preferences/requirements":{"get":{"tags":["teacher_correction_preferences"],"summary":"List Correction Requirements","description":"List all correction requirements for the current teacher.","operationId":"list_correction_requirements_teacher_correction_preferences_requirements_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CorrectionRequirementResponse"},"type":"array","title":"Response List Correction Requirements Teacher Correction Preferences Requirements Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["teacher_correction_preferences"],"summary":"Create Correction Requirement","description":"Create a new correction requirement.","operationId":"create_correction_requirement_teacher_correction_preferences_requirements_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionRequirementCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionRequirementResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher/correction-preferences/requirements/{requirement_id}":{"put":{"tags":["teacher_correction_preferences"],"summary":"Update Correction Requirement","description":"Update a correction requirement.","operationId":"update_correction_requirement_teacher_correction_preferences_requirements__requirement_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"requirement_id","in":"path","required":true,"schema":{"type":"string","title":"Requirement Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionRequirementUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionRequirementResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["teacher_correction_preferences"],"summary":"Delete Correction Requirement","description":"Delete a correction requirement and its activations.","operationId":"delete_correction_requirement_teacher_correction_preferences_requirements__requirement_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"requirement_id","in":"path","required":true,"schema":{"type":"string","title":"Requirement Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/correction-preferences/requirements/quick-create":{"post":{"tags":["teacher_correction_preferences"],"summary":"Quick Create Correction Requirement","description":"Create a correction requirement from raw prompt text.\nGenerates a short title automatically using LLM.","operationId":"quick_create_correction_requirement_teacher_correction_preferences_requirements_quick_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickCreateRequirementRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionRequirementResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/teacher/correction-preferences/requirements/{requirement_id}/grades":{"put":{"tags":["teacher_correction_preferences"],"summary":"Update Requirement Grade Assignments","description":"Update the grade assignments for a requirement.\nEmpty active_grades means the requirement applies to all grades.","operationId":"update_requirement_grade_assignments_teacher_correction_preferences_requirements__requirement_id__grades_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"requirement_id","in":"path","required":true,"schema":{"type":"string","title":"Requirement Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GradeAssignmentsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionRequirementResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/courses/{course_id}":{"get":{"tags":["knowledge-quiz"],"summary":"Get Course Quiz","description":"Get the knowledge quiz for a course (without answers).\nIf attempt_id is provided, returns questions resolved with that attempt's\nrandom variation selections and order.","operationId":"get_course_quiz_knowledge_quiz_courses__course_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"attempt_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attempt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuizResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/courses/{course_id}/start":{"post":{"tags":["knowledge-quiz"],"summary":"Start Quiz Attempt","description":"Start a new quiz attempt for a course.\nGenerates random variation selections and question order.","operationId":"start_quiz_attempt_knowledge_quiz_courses__course_id__start_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartAttemptRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttemptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/attempts/{attempt_id}/answer":{"post":{"tags":["knowledge-quiz"],"summary":"Submit Answer","description":"Submit an answer for a specific question in an attempt.\nUses the attempt's variation selection to check correctness.","operationId":"submit_answer_knowledge_quiz_attempts__attempt_id__answer_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","title":"Attempt Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitAnswerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitAnswerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/attempts/{attempt_id}/open-answer":{"post":{"tags":["knowledge-quiz"],"summary":"Submit Open Answer","description":"Submit photos of a handwritten answer for an open question.\nGrading runs asynchronously; poll the open-answers endpoint for the result.","operationId":"submit_open_answer_knowledge_quiz_attempts__attempt_id__open_answer_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","title":"Attempt Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitOpenAnswerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAnswerStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/attempts/{attempt_id}/open-answers":{"get":{"tags":["knowledge-quiz"],"summary":"Get Open Answer Statuses","description":"Grading state of every open answer in the attempt (polled while grading).","operationId":"get_open_answer_statuses_knowledge_quiz_attempts__attempt_id__open_answers_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","title":"Attempt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OpenAnswerStatusResponse"},"title":"Response Get Open Answer Statuses Knowledge Quiz Attempts  Attempt Id  Open Answers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/attempts/{attempt_id}/complete":{"post":{"tags":["knowledge-quiz"],"summary":"Complete Attempt","description":"Complete a quiz attempt and calculate the final score.","operationId":"complete_attempt_knowledge_quiz_attempts__attempt_id__complete_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","title":"Attempt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteAttemptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/courses/{course_id}/history":{"get":{"tags":["knowledge-quiz"],"summary":"Get Quiz History","description":"Get the student's quiz attempt history for a course.","operationId":"get_quiz_history_knowledge_quiz_courses__course_id__history_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"assignment_id","in":"query","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuizHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/my-courses/{course_id}":{"get":{"tags":["knowledge-quiz"],"summary":"Get My Course Quiz","description":"Get the knowledge quiz for a user's own course (without answers).\nIf attempt_id is provided, returns questions resolved with that attempt's\nrandom variation selections and order.","operationId":"get_my_course_quiz_knowledge_quiz_my_courses__course_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"attempt_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attempt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuizResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/my-courses/{course_id}/start":{"post":{"tags":["knowledge-quiz"],"summary":"Start Self Study Attempt","description":"Start a new self-study quiz attempt for user's own course.\nGenerates random variation selections and question order.","operationId":"start_self_study_attempt_knowledge_quiz_my_courses__course_id__start_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/StartSelfStudyRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfStudyAttemptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/my-courses/attempts/{attempt_id}/answer":{"post":{"tags":["knowledge-quiz"],"summary":"Submit Self Study Answer","description":"Submit an answer for a self-study quiz attempt.\nUses the attempt's variation selection to check correctness.","operationId":"submit_self_study_answer_knowledge_quiz_my_courses_attempts__attempt_id__answer_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","title":"Attempt Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitAnswerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitAnswerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/my-courses/attempts/{attempt_id}/open-answer":{"post":{"tags":["knowledge-quiz"],"summary":"Submit Self Study Open Answer","description":"Submit photos of a handwritten answer for an open question (self-study).","operationId":"submit_self_study_open_answer_knowledge_quiz_my_courses_attempts__attempt_id__open_answer_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","title":"Attempt Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitOpenAnswerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAnswerStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/my-courses/attempts/{attempt_id}/open-answers":{"get":{"tags":["knowledge-quiz"],"summary":"Get Self Study Open Answer Statuses","description":"Grading state of every open answer in a self-study attempt.","operationId":"get_self_study_open_answer_statuses_knowledge_quiz_my_courses_attempts__attempt_id__open_answers_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","title":"Attempt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OpenAnswerStatusResponse"},"title":"Response Get Self Study Open Answer Statuses Knowledge Quiz My Courses Attempts  Attempt Id  Open Answers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/my-courses/attempts/{attempt_id}/complete":{"post":{"tags":["knowledge-quiz"],"summary":"Complete Self Study Attempt","description":"Complete a self-study quiz attempt and calculate the final score.","operationId":"complete_self_study_attempt_knowledge_quiz_my_courses_attempts__attempt_id__complete_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","title":"Attempt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteAttemptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/my-courses/{course_id}/history":{"get":{"tags":["knowledge-quiz"],"summary":"Get Self Study History","description":"Get self-study quiz attempt history for a course.","operationId":"get_self_study_history_knowledge_quiz_my_courses__course_id__history_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfStudyHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/teacher/courses/{course_id}":{"get":{"tags":["knowledge-quiz"],"summary":"Get Teacher Course Quiz","description":"Get the knowledge quiz for a course with all variations (teacher view).","operationId":"get_teacher_course_quiz_knowledge_quiz_teacher_courses__course_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuizWithVariationsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/teacher/courses/{course_id}/questions/{question_id}":{"put":{"tags":["knowledge-quiz"],"summary":"Update Quiz Question","description":"Update a specific question in the quiz.\nFor backward compatibility, updates the legacy flat fields.","operationId":"update_quiz_question_knowledge_quiz_teacher_courses__course_id__questions__question_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"course_id","in":"path","required":true,"schema":{"type":"string","title":"Course Id"}},{"name":"question_id","in":"path","required":true,"schema":{"type":"string","title":"Question Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateQuestionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/teacher/assignments/{assignment_id}/analytics":{"get":{"tags":["knowledge-quiz"],"summary":"Get Quiz Analytics","description":"Get analytics for a course quiz assignment.\nShows aggregate stats and per-student results, for every class or for\none of the assignment's classes (`class_id`, decision D7).","operationId":"get_quiz_analytics_knowledge_quiz_teacher_assignments__assignment_id__analytics_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"class_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuizAnalyticsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-quiz/teacher/assignments/{assignment_id}/students/{student_id}":{"get":{"tags":["knowledge-quiz"],"summary":"Get Student Quiz Details","description":"Get detailed quiz results for a specific student.","operationId":"get_student_quiz_details_knowledge_quiz_teacher_assignments__assignment_id__students__student_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"student_id","in":"path","required":true,"schema":{"type":"string","title":"Student Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/annales-exercises/import":{"post":{"tags":["Admin - Annales Exercises"],"summary":"Import Annales Exercises","description":"Bulk import annales exercises from JSON. Upserts by source_annale + exerciseNumber.","operationId":"import_annales_exercises_admin_annales_exercises_import_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnalesExerciseImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Import Annales Exercises Admin Annales Exercises Import Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/annales-exercises":{"get":{"tags":["Admin - Annales Exercises"],"summary":"List Annales Exercises","description":"List annales exercises with optional filters.","operationId":"list_annales_exercises_admin_annales_exercises_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"session","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}},{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"}},{"name":"difficulty","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"}},{"name":"school_level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Level"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Annales Exercises Admin Annales Exercises Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin - Annales Exercises"],"summary":"Delete All Annales Exercises","description":"Delete all annales exercises (for reimport).","operationId":"delete_all_annales_exercises_admin_annales_exercises_delete","security":[{"OAuth2PasswordBearer":[]}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete All Annales Exercises Admin Annales Exercises Delete"}}}}}}},"/admin/annales-exercises/filters":{"get":{"tags":["Admin - Annales Exercises"],"summary":"Get Annales Filters","description":"Get distinct filter values for dropdowns.","operationId":"get_annales_filters_admin_annales_exercises_filters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Annales Filters Admin Annales Exercises Filters Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/annales-exercises/ai-review/preview":{"post":{"tags":["Admin - Annales Exercises"],"summary":"Preview Annales Ai Review","description":"Preview AI review operation - shows how many exercises will be reviewed.","operationId":"preview_annales_ai_review_admin_annales_exercises_ai_review_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnalesAIReviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnalesAIReviewPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/annales-exercises/ai-review/execute":{"post":{"tags":["Admin - Annales Exercises"],"summary":"Execute Annales Ai Review","description":"Execute AI review on annales exercises matching the filters.\nUses concurrent processing with up to 10 parallel workers.\nThe AI checks formatting issues (<br> in LaTeX), completeness, and LaTeX validity.","operationId":"execute_annales_ai_review_admin_annales_exercises_ai_review_execute_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnalesAIReviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnalesAIReviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/annales-exercises/change-requests":{"get":{"tags":["Admin - Annales Exercises"],"summary":"List Annales Change Requests","description":"List all annales exercises with pending change requests.","operationId":"list_annales_change_requests_admin_annales_exercises_change_requests_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnalesChangeRequestListResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/annales-exercises/change-requests/{exercise_id}/resolve":{"post":{"tags":["Admin - Annales Exercises"],"summary":"Resolve Annales Change Request","description":"Resolve a change request by either applying or rejecting the proposed changes.","operationId":"resolve_annales_change_request_admin_annales_exercises_change_requests__exercise_id__resolve_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnalesApplyChangeRequestInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/annales-exercises/batch-update-school-level":{"post":{"tags":["Admin - Annales Exercises"],"summary":"Batch Update School Level","description":"Batch-set schoolLevel on matching exercises.","operationId":"batch_update_school_level_admin_annales_exercises_batch_update_school_level_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchUpdateSchoolLevelRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchUpdateSchoolLevelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/annales-exercises/fix-br/preview":{"post":{"tags":["Admin - Annales Exercises"],"summary":"Preview Br Fix","description":"Preview deterministic cleanup of <br> and newlines inside LaTeX blocks.","operationId":"preview_br_fix_admin_annales_exercises_fix_br_preview_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrFixPreviewResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/annales-exercises/fix-br/apply":{"post":{"tags":["Admin - Annales Exercises"],"summary":"Apply Br Fix","description":"Apply deterministic cleanup of <br> and newlines inside LaTeX blocks.","operationId":"apply_br_fix_admin_annales_exercises_fix_br_apply_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrFixApplyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrFixApplyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/annales-exercises/{exercise_id}":{"get":{"tags":["Admin - Annales Exercises"],"summary":"Get Annales Exercise","description":"Get a single annales exercise by ID.","operationId":"get_annales_exercise_admin_annales_exercises__exercise_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Annales Exercise Admin Annales Exercises  Exercise Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin - Annales Exercises"],"summary":"Delete Annales Exercise","description":"Delete a single annales exercise.","operationId":"delete_annales_exercise_admin_annales_exercises__exercise_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Annales Exercise Admin Annales Exercises  Exercise Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/public-exercises/categories":{"get":{"tags":["Admin Public Exercises"],"summary":"Get Categories","description":"Return the full category tree with cumulative exercise counts.","operationId":"get_categories_admin_public_exercises_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryNode"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/public-exercises/by-category":{"get":{"tags":["Admin Public Exercises"],"summary":"List By Category","description":"List exercises whose category_path starts with `category` (strict prefix).","operationId":"list_by_category_admin_public_exercises_by_category_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","description":"Comma-separated path, e.g. 'Terminale,Probabilités'. Empty = root.","default":"","title":"Category"},"description":"Comma-separated path, e.g. 'Terminale,Probabilités'. Empty = root."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"difficulty","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring match on content","title":"Search"},"description":"Substring match on content"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List By Category Admin Public Exercises By Category Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/public-exercises/{exercise_id}":{"get":{"tags":["Admin Public Exercises"],"summary":"Get Exercise","description":"Full detail for the edit panel.","operationId":"get_exercise_admin_public_exercises__exercise_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExerciseDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/public-exercises/{exercise_id}/category-path":{"patch":{"tags":["Admin Public Exercises"],"summary":"Update Category Path","description":"Update a single exercise's category_path (and optionally difficulty).","operationId":"update_category_path_admin_public_exercises__exercise_id__category_path_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryPathUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExerciseDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/public-exercises/{exercise_id}/type":{"patch":{"tags":["Admin Public Exercises"],"summary":"Update Exercise Type","description":"Set the curator-defined `type` on a single exercise.","operationId":"update_exercise_type_admin_public_exercises__exercise_id__type_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExerciseTypeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExerciseDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/public-exercises/{exercise_id}/title":{"patch":{"tags":["Admin Public Exercises"],"summary":"Update Exercise Title","description":"Set or clear the short human-readable title on a single exercise.\n\nMirrors `/type` as a one-click curation action. Empty / None clears\nthe field by writing `null`.","operationId":"update_exercise_title_admin_public_exercises__exercise_id__title_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExerciseTitleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExerciseDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/public-exercises/{exercise_id}/regenerate-title":{"post":{"tags":["Admin Public Exercises"],"summary":"Regenerate Exercise Title","description":"Regenerate a title for a single exercise using the same Portkey\nwrapper + prompt as migration 024 (batch size 1).\n\nUsed by the admin curation drawer \"Régénérer\" button. Keeps the LLM\ncall synchronous (gpt-4o-mini, temperature 0.2). On success the new\ntitle is persisted + returned inside the detail payload.","operationId":"regenerate_exercise_title_admin_public_exercises__exercise_id__regenerate_title_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExerciseDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/public-exercises/{exercise_id}/savoirs-faire":{"patch":{"tags":["Admin Public Exercises"],"summary":"Update Exercise Savoirs Faire","description":"Replace the `savoirs_faire_ids` list on a single exercise.\n\nPhase B.2. Mirrors `/type` and `/category-path` as a one-click curation\naction (no fat payload, no unintended side effects on siblings like\n`content` or `category_path`). The request body is a full list — callers\nshould always send the desired end state, not a diff.","operationId":"update_exercise_savoirs_faire_admin_public_exercises__exercise_id__savoirs_faire_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavoirsFaireIdsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExerciseDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/public-exercises/bulk-move":{"post":{"tags":["Admin Public Exercises"],"summary":"Bulk Move Exercises","description":"Move a selection of exercises under a new category_path.","operationId":"bulk_move_exercises_admin_public_exercises_bulk_move_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMoveExercisesInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bulk Move Exercises Admin Public Exercises Bulk Move Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/public-exercises/move-category":{"post":{"tags":["Admin Public Exercises"],"summary":"Move Category","description":"Move every exercise whose category_path starts with `source_path`\nso that the source folder becomes a child of `destination_path`.\n\nMirrors the behaviour of `/calcul-exercises/move-category`: the moved\nfolder keeps its name (`source_path[-1]`) and any descendants below it\nare preserved. Passing an empty `destination_path` lifts the folder to\nthe root.","operationId":"move_category_admin_public_exercises_move_category_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__admin_public_exercises__MoveCategoryInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Move Category Admin Public Exercises Move Category Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/public-exercises/rename-category":{"post":{"tags":["Admin Public Exercises"],"summary":"Rename Category","description":"Rename the last segment of `category_path` for every exercise under\nthat prefix, AND mirror the rename into the `programmes` collection so\nthe curriculum tree stays aligned.","operationId":"rename_category_admin_public_exercises_rename_category_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__admin_public_exercises__RenameCategoryInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rename Category Admin Public Exercises Rename Category Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/programmes":{"get":{"tags":["Programmes"],"summary":"List Programmes","description":"Return all programmes ordered by `sort_order` (6ème → Terminale).\n\nFilters by the user's `teacher_type` so a lycée teacher doesn't see\nSup / Spé / ECG in their picker tree, AND by `subject` (matière) so a\nphysique-chimie teacher doesn't get the maths grades leaking into their\ntree (which produced duplicate \"Terminale\" nodes). Admins always see\neverything. Rows with empty `teacher_types` fall through (visible to all).","operationId":"list_programmes_programmes_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"include_disabled","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Disabled"}},{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"enum":["maths","physique-chimie"],"type":"string"},{"type":"null"}],"description":"Scope the curriculum tree to a matière. Defaults to the teacher's own subject; admins see all when omitted. Legacy maths rows (no field) match the maths clause.","title":"Subject"},"description":"Scope the curriculum tree to a matière. Defaults to the teacher's own subject; admins see all when omitted. Legacy maths rows (no field) match the maths clause."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Programme"},"title":"Response List Programmes Programmes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/programmes/{grade_key}":{"get":{"tags":["Programmes"],"summary":"Get Programme","operationId":"get_programme_programmes__grade_key__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"grade_key","in":"path","required":true,"schema":{"type":"string","title":"Grade Key"}},{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"enum":["maths","physique-chimie"],"type":"string"},{"type":"null"}],"description":"Disambiguate when the same grade_key exists per matière.","title":"Subject"},"description":"Disambiguate when the same grade_key exists per matière."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Programme"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/programmes":{"post":{"tags":["Admin Programmes"],"summary":"Create Programme","operationId":"create_programme_admin_programmes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgrammeCreateInput"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Programme"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/programmes/{grade_key}":{"patch":{"tags":["Admin Programmes"],"summary":"Update Programme","operationId":"update_programme_admin_programmes__grade_key__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"grade_key","in":"path","required":true,"schema":{"type":"string","title":"Grade Key"}},{"name":"subject","in":"query","required":false,"schema":{"enum":["maths","physique-chimie"],"type":"string","default":"maths","title":"Subject"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgrammeUpdateInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Programme"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin Programmes"],"summary":"Delete Programme","operationId":"delete_programme_admin_programmes__grade_key__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"grade_key","in":"path","required":true,"schema":{"type":"string","title":"Grade Key"}},{"name":"subject","in":"query","required":false,"schema":{"enum":["maths","physique-chimie"],"type":"string","default":"maths","title":"Subject"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/subjects":{"get":{"tags":["subjects"],"summary":"List Subjects","description":"Return every matière the platform knows about, in display order.\n\nThe chat persona stays server-side (not exposed) — the client only needs\nidentity + theme to build selectors and badges.","operationId":"list_subjects_subjects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SubjectOut"},"type":"array","title":"Response List Subjects Subjects Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/subjects/mine":{"get":{"tags":["subjects"],"summary":"List My Subjects","description":"Matières available to the current user.\n\n- A teacher teaches exactly one matière (their account `subject`).\n- A collège/lycée student (and an admin) has EVERY matière: availability,\n  not history — the pill is how they discover physique-chimie.\n- A prépa keeps the content-based rule (their classes and sessions), which\n  today means maths only.","operationId":"list_my_subjects_subjects_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MySubjectsResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/savoirs-faire":{"get":{"tags":["Savoirs Faire"],"summary":"List Savoirs Faire","description":"List all savoirs-faire, optionally filtered by grade/chapter.\n\nRead surface for teachers (Phase B.3 filter chip). No write ops\nhere — those live under `/admin/savoirs-faire`.","operationId":"list_savoirs_faire_savoirs_faire_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"grade_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade Key"}},{"name":"chapter_display","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Display"}},{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"enum":["maths","physique-chimie"],"type":"string"},{"type":"null"}],"title":"Subject"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SavoirFaireOut"},"title":"Response List Savoirs Faire Savoirs Faire Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/dashboard/overview":{"get":{"tags":["class_dashboard"],"summary":"Get Class Overview","description":"Moyenne générale, médiane, and the five most recent activities.\n\nRead WITHIN the period, unlike the mastery endpoint: \"what did we do this\ntrimester\" means the trimester.","operationId":"get_class_overview_teacher_classes__class_id__dashboard_overview_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Selected period: t1 / t2 / t3 / this_week / this_month / vacances_ete / school_year. An unrecognised value falls back to the full school year rather than erroring, so a stale bookmark still renders.","title":"Period"},"description":"Selected period: t1 / t2 / t3 / this_week / this_month / vacances_ete / school_year. An unrecognised value falls back to the full school year rather than erroring, so a stale bookmark still renders."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassOverviewResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/dashboard/rework":{"get":{"tags":["class_dashboard"],"summary":"Get Class Rework","description":"The savoir-faire from the period most worth a class-wide revision,\nmost widely missed first.\n\nWindowed, not cumulative: the block is about recent work. An empty list is\na real answer — no class-level priority has emerged — not an error, and\n`evaluated_students` is what lets the client say whether that is because\nnothing was evaluated yet.","operationId":"get_class_rework_teacher_classes__class_id__dashboard_rework_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Selected period: t1 / t2 / t3 / this_week / this_month / vacances_ete / school_year. An unrecognised value falls back to the full school year rather than erroring, so a stale bookmark still renders.","title":"Period"},"description":"Selected period: t1 / t2 / t3 / this_week / this_month / vacances_ete / school_year. An unrecognised value falls back to the full school year rather than erroring, so a stale bookmark still renders."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassReworkResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/dashboard/students":{"get":{"tags":["class_dashboard"],"summary":"Get Class Students Table","description":"One row per student plus the CLASSE aggregate.\n\nRows come back in roster order; the table's column sorting is client-side,\nso changing sort does not re-request.","operationId":"get_class_students_table_teacher_classes__class_id__dashboard_students_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Selected period: t1 / t2 / t3 / this_week / this_month / vacances_ete / school_year. An unrecognised value falls back to the full school year rather than erroring, so a stale bookmark still renders.","title":"Period"},"description":"Selected period: t1 / t2 / t3 / this_week / this_month / vacances_ete / school_year. An unrecognised value falls back to the full school year rather than erroring, so a stale bookmark still renders."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassStudentsTableResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/dashboard/mastery":{"get":{"tags":["class_dashboard"],"summary":"Get Class Mastery","description":"Chapters and savoir-faire with one strip cell per student.\n\nRead CUMULATIVELY: covers the school year up to the END of the selected\nperiod, not the period alone. A chapter taught in T1 is still part of what\nthe class knows in T3.","operationId":"get_class_mastery_teacher_classes__class_id__dashboard_mastery_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Selected period: t1 / t2 / t3 / this_week / this_month / vacances_ete / school_year. An unrecognised value falls back to the full school year rather than erroring, so a stale bookmark still renders.","title":"Period"},"description":"Selected period: t1 / t2 / t3 / this_week / this_month / vacances_ete / school_year. An unrecognised value falls back to the full school year rather than erroring, so a stale bookmark still renders."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassMasteryResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/classes/{class_id}/students/{student_id}/dashboard":{"get":{"tags":["class_dashboard"],"summary":"Get Student Sheet","description":"One student's marks, productions, and mastery profile for the period.\n\nBoth period semantics meet here: marks and productions are windowed, the\nmastery profile is cumulative from September.","operationId":"get_student_sheet_teacher_classes__class_id__students__student_id__dashboard_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"class_id","in":"path","required":true,"schema":{"type":"string","title":"Class Id"}},{"name":"student_id","in":"path","required":true,"schema":{"type":"string","title":"Student Id"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Selected period: t1 / t2 / t3 / this_week / this_month / vacances_ete / school_year. An unrecognised value falls back to the full school year rather than erroring, so a stale bookmark still renders.","title":"Period"},"description":"Selected period: t1 / t2 / t3 / this_week / this_month / vacances_ete / school_year. An unrecognised value falls back to the full school year rather than erroring, so a stale bookmark still renders."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentSheetResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/savoirs-faire":{"get":{"tags":["Admin Savoirs Faire"],"summary":"Admin List Savoirs Faire","description":"Same list, admin-auth variant. Separate endpoint so the admin\nsurface doesn't accidentally start leaking admin-only fields in\nthe future.","operationId":"admin_list_savoirs_faire_admin_savoirs_faire_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"grade_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade Key"}},{"name":"chapter_display","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter Display"}},{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"enum":["maths","physique-chimie"],"type":"string"},{"type":"null"}],"title":"Subject"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SavoirFaireOut"},"title":"Response Admin List Savoirs Faire Admin Savoirs Faire Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin Savoirs Faire"],"summary":"Create Savoir Faire","operationId":"create_savoir_faire_admin_savoirs_faire_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavoirFaireCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavoirFaireOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/savoirs-faire/{savoir_faire_id}":{"put":{"tags":["Admin Savoirs Faire"],"summary":"Update Savoir Faire","operationId":"update_savoir_faire_admin_savoirs_faire__savoir_faire_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"savoir_faire_id","in":"path","required":true,"schema":{"type":"string","title":"Savoir Faire Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavoirFaireUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavoirFaireOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin Savoirs Faire"],"summary":"Delete Savoir Faire","operationId":"delete_savoir_faire_admin_savoirs_faire__savoir_faire_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"savoir_faire_id","in":"path","required":true,"schema":{"type":"string","title":"Savoir Faire Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/savoirs-faire/coverage":{"get":{"tags":["Admin Savoirs Faire"],"summary":"Admin Savoirs Faire Coverage","description":"Per grade × chapter × savoir-faire exercise counts (admin diag).\n\nStrategy: load programmes (grade tree + chapter list) and savoirs_faire\nonce, then run a single aggregation over public_exercises grouping by\n(grade_display, chapter_display, sf_id, difficulty). The aggregation\nexcludes Legacy + remediation rows so the counts match what teachers\nactually browse. We `$unwind` `savoirs_faire_ids` with\n`preserveNullAndEmptyArrays` so untagged rows still feed the\nchapter-level \"untagged_exercise_count\" tally.","operationId":"admin_savoirs_faire_coverage_admin_savoirs_faire_coverage_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subject","in":"query","required":false,"schema":{"enum":["maths","physique-chimie"],"type":"string","default":"maths","title":"Subject"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SFCoverageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/annales-exercises":{"get":{"tags":["Annales Exercises"],"summary":"List Annales Exercises","description":"List annales exercises with optional filters (read-only for teachers).","operationId":"list_annales_exercises_annales_exercises_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"session","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}},{"name":"exam_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exam bank: 'bac', 'brevet' or 'olympiades'.","title":"Exam Type"},"description":"Exam bank: 'bac', 'brevet' or 'olympiades'."},{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"One or more topics. Pass `?topic=fonctions&topic=limites` to match annales tagged with ALL listed topics ($all semantics).","title":"Topic"},"description":"One or more topics. Pass `?topic=fonctions&topic=limites` to match annales tagged with ALL listed topics ($all semantics)."},{"name":"difficulty","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"}},{"name":"school_level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Level"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Annales Exercises Annales Exercises Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/annales-exercises/filters":{"get":{"tags":["Annales Exercises"],"summary":"Get Annales Filters","description":"Get distinct filter values for dropdowns, optionally scoped.","operationId":"get_annales_filters_annales_exercises_filters_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"If set, scope returned years/sessions/topics/difficulties to annales for this school level. school_levels itself is always returned across the whole collection.","title":"School Level"},"description":"If set, scope returned years/sessions/topics/difficulties to annales for this school level. school_levels itself is always returned across the whole collection."},{"name":"exam_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"If set ('bac' | 'brevet' | 'olympiades'), scope returned years/sessions/topics/difficulties to that exam bank.","title":"Exam Type"},"description":"If set ('bac' | 'brevet' | 'olympiades'), scope returned years/sessions/topics/difficulties to that exam bank."},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"If set, scope returned sessions/topics to that year.","title":"Year"},"description":"If set, scope returned sessions/topics to that year."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Annales Filters Annales Exercises Filters Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/annales-exercises/tree":{"get":{"tags":["Annales Exercises"],"summary":"Get Annales Tree","description":"Hierarchy for the picker's foldable annales tree.\n\nShape: school level -> exam type (bac / brevet / olympiades) -> year,\neach node carrying its exercise count.","operationId":"get_annales_tree_annales_exercises_tree_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Annales Tree Annales Exercises Tree Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/annales-exercises/grouped":{"get":{"tags":["Annales Exercises"],"summary":"List Annales Exercises Grouped","description":"List annales exercises grouped by source_annale for browsing.","operationId":"list_annales_exercises_grouped_annales_exercises_grouped_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"school_level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Level"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"session","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}},{"name":"exam_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exam Type"}},{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"}},{"name":"difficulty","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Annales Exercises Grouped Annales Exercises Grouped Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/annales-exercises/{exercise_id}":{"get":{"tags":["Annales Exercises"],"summary":"Get Annales Exercise","description":"Get a single annales exercise by ID.","operationId":"get_annales_exercise_annales_exercises__exercise_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Annales Exercise Annales Exercises  Exercise Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/exercises/{exercise_id}/rubric":{"get":{"tags":["rubrics"],"summary":"Get Exercise Rubric","operationId":"get_exercise_rubric_teacher_exercises__exercise_id__rubric_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"const":"ai_original","type":"string"},{"type":"null"}],"description":"When 'ai_original', returns the most recent AI-authored rubric regardless of the current FK pointer (powers the editor's reset button).","title":"Source"},"description":"When 'ai_original', returns the most recent AI-authored rubric regardless of the current FK pointer (powers the editor's reset button)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["rubrics"],"summary":"Create Exercise Rubric","operationId":"create_exercise_rubric_teacher_exercises__exercise_id__rubric_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Business rule violated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["rubrics"],"summary":"Override Exercise Rubric","operationId":"override_exercise_rubric_teacher_exercises__exercise_id__rubric_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricOverrideRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Business rule violated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/rubrics/{rubric_id}":{"get":{"tags":["rubrics"],"summary":"Get Rubric By Id","operationId":"get_rubric_by_id_teacher_rubrics__rubric_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"rubric_id","in":"path","required":true,"schema":{"type":"string","title":"Rubric Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/savoirs-faire":{"get":{"tags":["rubrics"],"summary":"List Savoirs Faire","operationId":"list_savoirs_faire_teacher_savoirs_faire_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SavoirFaireListItem"},"type":"array","title":"Response List Savoirs Faire Teacher Savoirs Faire Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/sessions/{session_id}/exercises/{exercise_id}/v2-evaluation":{"get":{"tags":["v2_evaluations"],"summary":"Get Student Evaluation","operationId":"get_student_evaluation_sessions__session_id__exercises__exercise_id__v2_evaluation_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentEvaluationResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/v2-grade-breakdown":{"get":{"tags":["v2_evaluations"],"summary":"Get Session Grade Breakdown","operationId":"get_session_grade_breakdown_sessions__session_id__v2_grade_breakdown_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionGradeBreakdownResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/v2-evaluations":{"get":{"tags":["v2_evaluations"],"summary":"Get Class Evaluations","description":"Class-wide evaluation snapshot. Heavy payload (~1MB for a 30×10\nclass), so we let the client conditionally short-circuit with\n`If-None-Match` against a weak ETag derived from the latest session\n`updated_at`. A teacher who keeps the results page open and re-fetches\non a route change gets a 304 with empty body when nothing has moved.","operationId":"get_class_evaluations_teacher_assignments__assignment_id__v2_evaluations_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}},{"name":"if-none-match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassEvaluationsResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/assignments/{assignment_id}/v2-class-appreciation":{"get":{"tags":["v2_evaluations"],"summary":"Get Class Appreciation","description":"Class-wide narrative appreciation. Auto-generated on first visit\nAFTER the assignment's due date passes; cached against the class-evals\nETag so subsequent visits short-circuit. Returns 404 with an empty body\nwhen the assignment is unknown, not yet overdue, or has no sessions\nto summarize — the frontend treats all three identically (empty state).\nMirrors the no-annotation return type of `get_class_evaluations` above\nso the 304/404 short-circuits don't fight pyright.","operationId":"get_class_appreciation_teacher_assignments__assignment_id__v2_class_appreciation_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassAppreciationResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Upstream LLM returned unusable output","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/sessions/{session_id}/exercises/{exercise_id}/v2-evaluation":{"put":{"tags":["v2_evaluations"],"summary":"Override Evaluation","operationId":"override_evaluation_teacher_sessions__session_id__exercises__exercise_id__v2_evaluation_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationOverrideRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricEvaluationResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Business rule violated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/teacher/sessions/{session_id}/exercises/{exercise_id}/v2-evaluation/legacy-reeval":{"post":{"tags":["v2_evaluations"],"summary":"Reevaluate Legacy Submission","operationId":"reevaluate_legacy_submission_teacher_sessions__session_id__exercises__exercise_id__v2_evaluation_legacy_reeval_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricEvaluationResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Business rule violated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Upstream LLM returned unusable output","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/exercises/{exercise_id}/photo-submission":{"post":{"tags":["photo_submissions"],"summary":"Submit Exercise Photos","operationId":"submit_exercise_photos_exercise_sessions__session_id__exercises__exercise_id__photo_submission_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhotoSubmissionCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhotoSubmissionResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Business rule violated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/photo-submission":{"post":{"tags":["photo_submissions"],"summary":"Submit Session Photos","operationId":"submit_session_photos_exercise_sessions__session_id__photo_submission_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionPhotoSubmissionCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionPhotoSubmissionResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Business rule violated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercise-sessions/{session_id}/photo-submission-status":{"get":{"tags":["photo_submissions"],"summary":"Get Photo Submission Statuses","operationId":"get_photo_submission_statuses_exercise_sessions__session_id__photo_submission_status_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhotoSubmissionStatusesResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not authorized for this resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/student/error-analysis":{"get":{"tags":["error_analysis"],"summary":"Get Student Error Analysis","description":"Analyze the authenticated student's own recent first-submission errors.\n\nMay generate (and persist) v2 evaluations on the fly for first submissions\nthat don't have one yet, so the first call after a stretch of activity can\ntake longer; subsequent calls reuse the persisted evaluations.","operationId":"get_student_error_analysis_student_error_analysis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentErrorAnalysisResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Upstream LLM returned unusable output","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/student/progression":{"get":{"tags":["student_progression"],"summary":"Get Student Progression","description":"Skill + theme mastery for the authenticated student's dashboard.\n\nMay generate (and persist) v2 evaluations on the fly for first submissions\nthat don't have one yet — the same cold-start routine the error-analysis\nendpoint uses — so the first call after a stretch of activity can take\nlonger; subsequent calls reuse the persisted evaluations.","operationId":"get_student_progression_student_progression_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentProgressionResponse"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed identifier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Upstream LLM returned unusable output","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}}},"components":{"schemas":{"AIAuthor":{"properties":{"type":{"type":"string","const":"ai","title":"Type","default":"ai"},"prompt_id":{"type":"string","title":"Prompt Id"}},"type":"object","required":["prompt_id"],"title":"AIAuthor"},"AIReviewPreviewResponse":{"properties":{"total_templates":{"type":"integer","title":"Total Templates"},"already_to_review":{"type":"integer","title":"Already To Review"},"has_change_request":{"type":"integer","title":"Has Change Request"},"to_be_reviewed":{"type":"integer","title":"To Be Reviewed"},"template_ids":{"items":{"type":"string"},"type":"array","title":"Template Ids"}},"type":"object","required":["total_templates","already_to_review","has_change_request","to_be_reviewed","template_ids"],"title":"AIReviewPreviewResponse","description":"Response for AI review preview (before confirmation)"},"AIReviewRequest":{"properties":{"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path","description":"Category path to review (will include all subfolders)"},"skip_to_review":{"type":"boolean","title":"Skip To Review","description":"Skip exercises already marked as to_review","default":true},"skip_with_change_request":{"type":"boolean","title":"Skip With Change Request","description":"Skip exercises that already have a pending change request","default":true}},"type":"object","required":["category_path"],"title":"AIReviewRequest","description":"Request model for AI review of exercises"},"AIReviewResponse":{"properties":{"success":{"type":"integer","title":"Success"},"failed":{"type":"integer","title":"Failed"},"skipped":{"type":"integer","title":"Skipped"},"no_change":{"type":"integer","title":"No Change"},"change_requests":{"type":"integer","title":"Change Requests"},"marked_to_review":{"type":"integer","title":"Marked To Review"},"results":{"items":{"$ref":"#/components/schemas/AIReviewResultItem"},"type":"array","title":"Results"}},"type":"object","required":["success","failed","skipped","no_change","change_requests","marked_to_review","results"],"title":"AIReviewResponse","description":"Response for AI review operation"},"AIReviewResultItem":{"properties":{"template_id":{"type":"string","title":"Template Id"},"title":{"type":"string","title":"Title"},"action":{"type":"string","enum":["none","change_request","to_review"],"title":"Action"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"proposed_changes":{"anyOf":[{"$ref":"#/components/schemas/ProposedChanges"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["template_id","title","action"],"title":"AIReviewResultItem","description":"Result for a single template review"},"AcceptStructuredSubjectRequest":{"properties":{"exercises":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Exercises"}},"type":"object","required":["exercises"],"title":"AcceptStructuredSubjectRequest"},"AccessGrantResponse":{"properties":{"student_id":{"type":"string","title":"Student Id"},"access_level":{"type":"string","title":"Access Level"},"granted_by":{"type":"string","title":"Granted By"},"granted_at":{"type":"string","format":"date-time","title":"Granted At"},"admin_granter_id":{"type":"string","title":"Admin Granter Id"},"message":{"type":"string","title":"Message"}},"type":"object","required":["student_id","access_level","granted_by","granted_at","admin_granter_id","message"],"title":"AccessGrantResponse","description":"Response model for access grant operation."},"AccessRevokeResponse":{"properties":{"student_id":{"type":"string","title":"Student Id"},"message":{"type":"string","title":"Message"},"revoked_at":{"type":"string","format":"date-time","title":"Revoked At"}},"type":"object","required":["student_id","message","revoked_at"],"title":"AccessRevokeResponse","description":"Response model for access revoke operation."},"AccessStatusResponse":{"properties":{"student_id":{"type":"string","title":"Student Id"},"has_access":{"type":"boolean","title":"Has Access"},"access_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Level"},"granted_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted By"},"granted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Granted At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"admin_granter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Granter Id"},"stripe_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Subscription Id"}},"type":"object","required":["student_id","has_access"],"title":"AccessStatusResponse","description":"Response model for access status check."},"AcquisitionModeBody":{"properties":{"mode":{"type":"string","title":"Mode"}},"type":"object","required":["mode"],"title":"AcquisitionModeBody"},"AcquisitionStatusBody":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"AcquisitionStatusBody"},"Activity":{"properties":{"module":{"type":"string","title":"Module"},"title":{"type":"string","title":"Title"},"date":{"type":"string","format":"date-time","title":"Date"},"details":{"type":"string","title":"Details"}},"type":"object","required":["module","title","date","details"],"title":"Activity"},"AddExerciseRequest":{"properties":{"class_level":{"type":"string","title":"Class Level"},"chapters":{"type":"string","title":"Chapters"},"thematics":{"type":"string","title":"Thematics"},"difficulty":{"type":"integer","title":"Difficulty"},"number_of_exercises":{"type":"integer","title":"Number Of Exercises"},"additional_thematics":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Thematics"}},"type":"object","required":["class_level","chapters","thematics","difficulty","number_of_exercises"],"title":"AddExerciseRequest"},"AddExercisesFromAnnalesRequest":{"properties":{"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"}},"type":"object","required":["exercise_ids"],"title":"AddExercisesFromAnnalesRequest"},"AddExercisesFromExcellenceRequest":{"properties":{"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"}},"type":"object","required":["exercise_ids"],"title":"AddExercisesFromExcellenceRequest"},"AddExercisesFromUploadRequest":{"properties":{"content":{"type":"string","title":"Content"},"images":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Images"},"diagram_image_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Diagram Image Urls"}},"type":"object","required":["content"],"title":"AddExercisesFromUploadRequest"},"AddExercisesRequest":{"properties":{"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"}},"type":"object","required":["exercise_ids"],"title":"AddExercisesRequest"},"AddExistingTeacherRequest":{"properties":{"teacher_id":{"type":"string","title":"Teacher Id"},"matched_expected_teacher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matched Expected Teacher"}},"type":"object","required":["teacher_id"],"title":"AddExistingTeacherRequest","description":"Request model for adding an existing teacher to a school"},"AddExistingTeacherResponse":{"properties":{"message":{"type":"string","title":"Message"},"teacher_id":{"type":"string","title":"Teacher Id"},"membership_created":{"type":"boolean","title":"Membership Created"}},"type":"object","required":["message","teacher_id","membership_created"],"title":"AddExistingTeacherResponse","description":"Response model for adding existing teacher to school"},"AddImagesRequest":{"properties":{"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"}},"type":"object","required":["image_urls"],"title":"AddImagesRequest"},"AddStudentByEmail":{"properties":{"student_email":{"type":"string","format":"email","title":"Student Email"},"privateKey":{"type":"string","title":"Privatekey"}},"type":"object","required":["student_email","privateKey"],"title":"AddStudentByEmail"},"AddTeacherToSchoolRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"}},"type":"object","required":["email"],"title":"AddTeacherToSchoolRequest","description":"Request model for creating a new teacher account and adding to school"},"AddTeacherToSchoolResponse":{"properties":{"message":{"type":"string","title":"Message"},"teacher_id":{"type":"string","title":"Teacher Id"},"created_new_account":{"type":"boolean","title":"Created New Account"}},"type":"object","required":["message","teacher_id","created_new_account"],"title":"AddTeacherToSchoolResponse","description":"Response model for adding teacher to school"},"AddTextRequest":{"properties":{"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"AddTextRequest"},"AddUnitRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"Instructions for the new unit content"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position","description":"Position to insert the unit (0-based, None for end)"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Optional title for the new unit"}},"type":"object","required":["prompt"],"title":"AddUnitRequest","description":"Request model for adding a new unit with AI generation."},"AdminAccountResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"}},"type":"object","required":["id","name","email"],"title":"AdminAccountResponse","description":"An admin account, offered as a contract owner."},"AdminAddPendingStudentsRequest":{"properties":{"students":{"items":{"$ref":"#/components/schemas/AdminRosterStudent"},"type":"array","title":"Students"},"send_invitations":{"type":"boolean","title":"Send Invitations","default":true}},"type":"object","required":["students"],"title":"AdminAddPendingStudentsRequest"},"AdminAddStudentToClassBody":{"properties":{"class_id":{"type":"string","title":"Class Id"},"school_id":{"type":"string","title":"School Id"}},"type":"object","required":["class_id","school_id"],"title":"AdminAddStudentToClassBody"},"AdminAddStudentToClassResponse":{"properties":{"detail":{"type":"string","title":"Detail"},"student_id":{"type":"string","title":"Student Id"},"class_id":{"type":"string","title":"Class Id"},"class_name":{"type":"string","title":"Class Name"},"teacher_name":{"type":"string","title":"Teacher Name"},"school_id":{"type":"string","title":"School Id"},"school_name":{"type":"string","title":"School Name"}},"type":"object","required":["detail","student_id","class_id","class_name","teacher_name","school_id","school_name"],"title":"AdminAddStudentToClassResponse"},"AdminAssignmentDetailResponse":{"properties":{"assignment":{"$ref":"#/components/schemas/AssignmentInfo"},"teacher_info":{"additionalProperties":true,"type":"object","title":"Teacher Info"},"exercises":{"items":{"$ref":"#/components/schemas/ExerciseDetails"},"type":"array","title":"Exercises"},"student_sessions":{"items":{"$ref":"#/components/schemas/StudentSessionDetails"},"type":"array","title":"Student Sessions"},"average_duration_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Duration Minutes"}},"type":"object","required":["assignment","teacher_info","exercises","student_sessions"],"title":"AdminAssignmentDetailResponse","description":"Extended assignment detail response with teacher information for admin view"},"AdminAssignmentResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"teacher_id":{"type":"string","title":"Teacher Id"},"teacher_name":{"type":"string","title":"Teacher Name"},"teacher_email":{"type":"string","title":"Teacher Email"},"class_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"},"class_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Name"},"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"},"binary_grading":{"type":"boolean","title":"Binary Grading"},"randomize_order":{"type":"boolean","title":"Randomize Order"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"student_count":{"type":"integer","title":"Student Count"},"chat_policy":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Chat Policy"},"chat_scoring_policy":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Chat Scoring Policy"},"retry_policy":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Retry Policy"},"pending_review_request_count":{"type":"integer","title":"Pending Review Request Count","default":0}},"type":"object","required":["id","title","teacher_id","teacher_name","teacher_email","exercise_ids","binary_grading","randomize_order","created_at","updated_at","student_count"],"title":"AdminAssignmentResponse","description":"Extended assignment response with teacher information for admin view"},"AdminCreateTeacherClassRequest":{"properties":{"name":{"type":"string","title":"Name"},"grade":{"anyOf":[{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},{"type":"null"}],"title":"Grade"},"students":{"items":{"$ref":"#/components/schemas/AdminRosterStudent"},"type":"array","title":"Students"},"send_invitations":{"type":"boolean","title":"Send Invitations","default":true}},"type":"object","required":["name"],"title":"AdminCreateTeacherClassRequest"},"AdminExamContentUpdate":{"properties":{"exam_subject_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exam Subject Title"},"structured_exercises":{"anyOf":[{"items":{"$ref":"#/components/schemas/ExamExercise"},"type":"array"},{"type":"null"}],"title":"Structured Exercises"}},"type":"object","title":"AdminExamContentUpdate","description":"Request model for updating exam content."},"AdminExerciseImageTranscriptionResponse":{"properties":{"transcribed_content":{"type":"string","title":"Transcribed Content"},"s3_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Image Url"}},"type":"object","required":["transcribed_content"],"title":"AdminExerciseImageTranscriptionResponse","description":"Response model for admin exercise image transcription"},"AdminExerciseImageUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"AdminExerciseImageUploadRequest","description":"Request model for admin exercise image transcription"},"AdminRosterStudent":{"properties":{"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"}},"type":"object","required":["first_name","last_name"],"title":"AdminRosterStudent"},"AdminTeacherClassResponse":{"properties":{"class_id":{"type":"string","title":"Class Id"},"class_code":{"type":"string","title":"Class Code"},"name":{"type":"string","title":"Name"},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade"},"subject":{"type":"string","title":"Subject"},"school_year":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Year"},"teacher_id":{"type":"string","title":"Teacher Id"},"teacher_email":{"type":"string","title":"Teacher Email"},"students_added":{"type":"integer","title":"Students Added"},"students_skipped":{"type":"integer","title":"Students Skipped"},"invitations_sent":{"type":"integer","title":"Invitations Sent"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["class_id","class_code","name","subject","teacher_id","teacher_email","students_added","students_skipped","invitations_sent","warnings"],"title":"AdminTeacherClassResponse"},"AdminTeacherExamDetail":{"properties":{"id":{"type":"string","title":"Id"},"teacher_id":{"type":"string","title":"Teacher Id"},"teacher_name":{"type":"string","title":"Teacher Name"},"teacher_email":{"type":"string","title":"Teacher Email"},"exam_subject_title":{"type":"string","title":"Exam Subject Title"},"exam_subject_images":{"items":{"type":"string"},"type":"array","title":"Exam Subject Images"},"correction_images":{"items":{"type":"string"},"type":"array","title":"Correction Images"},"custom_grading_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Grading Instructions"},"structured_exercises":{"items":{"$ref":"#/components/schemas/ExamExercise"},"type":"array","title":"Structured Exercises"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","teacher_id","teacher_name","teacher_email","exam_subject_title","exam_subject_images","correction_images","structured_exercises","created_at"],"title":"AdminTeacherExamDetail","description":"Detailed teacher exam for admin view."},"AdminTeacherExamListItem":{"properties":{"id":{"type":"string","title":"Id"},"teacher_id":{"type":"string","title":"Teacher Id"},"teacher_name":{"type":"string","title":"Teacher Name"},"teacher_email":{"type":"string","title":"Teacher Email"},"exam_subject_title":{"type":"string","title":"Exam Subject Title"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","teacher_id","teacher_name","teacher_email","exam_subject_title","created_at"],"title":"AdminTeacherExamListItem","description":"Teacher exam list item for admin view."},"AdminTeacherExamsResponse":{"properties":{"status":{"type":"string","title":"Status"},"exams":{"items":{"$ref":"#/components/schemas/AdminTeacherExamListItem"},"type":"array","title":"Exams"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["status","exams","total","page","limit"],"title":"AdminTeacherExamsResponse","description":"Response for admin teacher exams list."},"AgentSessionResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"room_name":{"type":"string","title":"Room Name"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time"},"status":{"type":"string","title":"Status"},"agent_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Type"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"agent_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Agent Data"},"transcript":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Transcript"}},"type":"object","required":["id","user_id","room_name","start_time","status"],"title":"AgentSessionResponse","description":"Pydantic model for agent session response."},"AiEditRequest":{"properties":{"prompt":{"type":"string","title":"Prompt"}},"type":"object","required":["prompt"],"title":"AiEditRequest"},"AllSchoolsAnalyticsItem":{"properties":{"school_id":{"type":"string","title":"School Id"},"school_name":{"type":"string","title":"School Name"},"school_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Domain"},"school_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School City"},"contract_type":{"type":"string","enum":["free","pilot","paid","expired"],"title":"Contract Type"},"contract_end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Contract End Date"},"billed_students":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Billed Students"},"owner_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Name"},"has_gesture":{"type":"boolean","title":"Has Gesture","default":false},"segments":{"items":{"type":"string","enum":["college","lycee","prepa"]},"type":"array","title":"Segments"},"total_teachers":{"type":"integer","title":"Total Teachers"},"total_classes":{"type":"integer","title":"Total Classes"},"total_students":{"type":"integer","title":"Total Students"},"total_exercises_completed":{"type":"integer","title":"Total Exercises Completed"},"total_homework_exercises":{"type":"integer","title":"Total Homework Exercises"},"total_chat_words":{"type":"integer","title":"Total Chat Words"},"active_students_last_month":{"type":"integer","title":"Active Students Last Month"},"active_teachers_last_month":{"type":"integer","title":"Active Teachers Last Month","default":0}},"type":"object","required":["school_id","school_name","contract_type","total_teachers","total_classes","total_students","total_exercises_completed","total_homework_exercises","total_chat_words","active_students_last_month"],"title":"AllSchoolsAnalyticsItem","description":"Analytics for a single school in the aggregated view"},"AllSchoolsAnalyticsResponse":{"properties":{"total_schools":{"type":"integer","title":"Total Schools"},"total_schools_in_trial":{"type":"integer","title":"Total Schools In Trial"},"total_schools_in_pilot":{"type":"integer","title":"Total Schools In Pilot"},"total_schools_paid":{"type":"integer","title":"Total Schools Paid","default":0},"total_schools_expired":{"type":"integer","title":"Total Schools Expired","default":0},"total_teachers":{"type":"integer","title":"Total Teachers"},"total_students":{"type":"integer","title":"Total Students"},"total_exercises_completed":{"type":"integer","title":"Total Exercises Completed"},"total_homework_exercises":{"type":"integer","title":"Total Homework Exercises"},"total_chat_words":{"type":"integer","title":"Total Chat Words"},"total_active_students_last_month":{"type":"integer","title":"Total Active Students Last Month"},"total_active_teachers_last_month":{"type":"integer","title":"Total Active Teachers Last Month","default":0},"total_billed_students":{"type":"integer","title":"Total Billed Students","default":0},"teachers_by_segment":{"additionalProperties":{"type":"integer"},"type":"object","title":"Teachers By Segment"},"schools":{"items":{"$ref":"#/components/schemas/AllSchoolsAnalyticsItem"},"type":"array","title":"Schools"},"weeks_analyzed":{"type":"integer","title":"Weeks Analyzed"},"analysis_start_date":{"type":"string","format":"date-time","title":"Analysis Start Date"},"analysis_end_date":{"type":"string","format":"date-time","title":"Analysis End Date"}},"type":"object","required":["total_schools","total_schools_in_trial","total_schools_in_pilot","total_teachers","total_students","total_exercises_completed","total_homework_exercises","total_chat_words","total_active_students_last_month","schools","weeks_analyzed","analysis_start_date","analysis_end_date"],"title":"AllSchoolsAnalyticsResponse","description":"Aggregated analytics for all schools"},"AnnaleSujetExerciseOut":{"properties":{"id":{"type":"string","title":"Id"},"number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Number"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"points":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Points"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"excerpt":{"type":"string","title":"Excerpt","default":""}},"type":"object","required":["id"],"title":"AnnaleSujetExerciseOut"},"AnnaleSujetOut":{"properties":{"source_annale":{"type":"string","title":"Source Annale"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"},"session":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"},"school_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Level"},"exercise_count":{"type":"integer","title":"Exercise Count"},"total_points":{"type":"number","title":"Total Points"},"topics":{"items":{"type":"string"},"type":"array","title":"Topics"},"exercises":{"items":{"$ref":"#/components/schemas/AnnaleSujetExerciseOut"},"type":"array","title":"Exercises"}},"type":"object","required":["source_annale","exercise_count","total_points"],"title":"AnnaleSujetOut"},"AnnalesAIReviewPreviewResponse":{"properties":{"total_exercises":{"type":"integer","title":"Total Exercises"},"already_to_review":{"type":"integer","title":"Already To Review"},"has_change_request":{"type":"integer","title":"Has Change Request"},"to_be_reviewed":{"type":"integer","title":"To Be Reviewed"},"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"}},"type":"object","required":["total_exercises","already_to_review","has_change_request","to_be_reviewed","exercise_ids"],"title":"AnnalesAIReviewPreviewResponse","description":"Response for AI review preview (before confirmation)."},"AnnalesAIReviewRequest":{"properties":{"year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"},"session":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"school_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Level"},"skip_to_review":{"type":"boolean","title":"Skip To Review","description":"Skip exercises already marked as to_review","default":true},"skip_with_change_request":{"type":"boolean","title":"Skip With Change Request","description":"Skip exercises that already have a pending change request","default":true}},"type":"object","title":"AnnalesAIReviewRequest","description":"Request model for AI review of annales exercises."},"AnnalesAIReviewResponse":{"properties":{"success":{"type":"integer","title":"Success"},"failed":{"type":"integer","title":"Failed"},"skipped":{"type":"integer","title":"Skipped"},"no_change":{"type":"integer","title":"No Change"},"change_requests":{"type":"integer","title":"Change Requests"},"marked_to_review":{"type":"integer","title":"Marked To Review"},"results":{"items":{"$ref":"#/components/schemas/AnnalesAIReviewResultItem"},"type":"array","title":"Results"}},"type":"object","required":["success","failed","skipped","no_change","change_requests","marked_to_review","results"],"title":"AnnalesAIReviewResponse","description":"Response for AI review operation."},"AnnalesAIReviewResultItem":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"title":{"type":"string","title":"Title"},"action":{"type":"string","enum":["none","change_request","to_review"],"title":"Action"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["exercise_id","title","action"],"title":"AnnalesAIReviewResultItem","description":"Result for a single exercise review."},"AnnalesApplyChangeRequestInput":{"properties":{"apply":{"type":"boolean","title":"Apply","description":"True to apply changes, False to reject"}},"type":"object","required":["apply"],"title":"AnnalesApplyChangeRequestInput","description":"Input for applying or rejecting a change request."},"AnnalesChangeRequestInfo":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"title":{"type":"string","title":"Title"},"source_annale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Annale"},"reason":{"type":"string","title":"Reason"},"proposed_changes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Proposed Changes"},"current_content":{"type":"string","title":"Current Content"},"current_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Solution"}},"type":"object","required":["exercise_id","title","source_annale","reason","proposed_changes","current_content","current_solution"],"title":"AnnalesChangeRequestInfo","description":"Info about a pending change request on an annales exercise."},"AnnalesChangeRequestListResponse":{"properties":{"total":{"type":"integer","title":"Total"},"change_requests":{"items":{"$ref":"#/components/schemas/AnnalesChangeRequestInfo"},"type":"array","title":"Change Requests"}},"type":"object","required":["total","change_requests"],"title":"AnnalesChangeRequestListResponse","description":"Response with list of pending change requests."},"AnnalesExerciseImportItem":{"properties":{"number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Number"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"points":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Points"},"content":{"type":"string","title":"Content","default":""},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution"},"figure_content":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Figure Solution"},"parts":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Parts"},"tags":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tags"},"source_annale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Annale"},"source_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Source Metadata"}},"type":"object","title":"AnnalesExerciseImportItem"},"AnnalesExerciseImportRequest":{"properties":{"exercises":{"items":{"$ref":"#/components/schemas/AnnalesExerciseImportItem"},"type":"array","title":"Exercises"}},"type":"object","required":["exercises"],"title":"AnnalesExerciseImportRequest"},"AnonymousEvent":{"properties":{"onboarding_session_id":{"type":"string","minLength":8,"title":"Onboarding Session Id"},"step":{"type":"string","title":"Step"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"device_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Type"},"context":{"additionalProperties":true,"type":"object","title":"Context"}},"type":"object","required":["onboarding_session_id","step"],"title":"AnonymousEvent"},"AppVersionCreate":{"properties":{"version":{"type":"string","title":"Version"},"platform":{"type":"string","title":"Platform","default":"all"},"is_breaking":{"type":"boolean","title":"Is Breaking","default":false},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["version"],"title":"AppVersionCreate"},"AppVersionResponse":{"properties":{"version":{"type":"string","title":"Version"},"platform":{"type":"string","title":"Platform"},"is_breaking":{"type":"boolean","title":"Is Breaking"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["version","platform","is_breaking","created_at"],"title":"AppVersionResponse"},"ApplyChangeRequestInput":{"properties":{"apply":{"type":"boolean","title":"Apply","description":"True to apply changes, False to reject"}},"type":"object","required":["apply"],"title":"ApplyChangeRequestInput","description":"Input for applying or rejecting a change request"},"ApplyRecorrectionItem":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"new_correctness":{"type":"string","enum":["correct","partial","wrong"],"title":"New Correctness"},"new_feedback":{"type":"string","title":"New Feedback"}},"type":"object","required":["session_id","exercise_id","new_correctness","new_feedback"],"title":"ApplyRecorrectionItem"},"ApplyRecorrectionRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ApplyRecorrectionItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ApplyRecorrectionRequest"},"ApplyRecorrectionResponse":{"properties":{"applied_count":{"type":"integer","title":"Applied Count"}},"type":"object","required":["applied_count"],"title":"ApplyRecorrectionResponse"},"AssignPagesBody":{"properties":{"assignments":{"items":{"$ref":"#/components/schemas/PageAssignment"},"type":"array","title":"Assignments"}},"type":"object","required":["assignments"],"title":"AssignPagesBody"},"AssignmentClassScheduleOut":{"properties":{"class_id":{"type":"string","title":"Class Id"},"class_name":{"type":"string","title":"Class Name"},"school_year":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Year"},"is_past":{"type":"boolean","title":"Is Past","default":false},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"}},"type":"object","required":["class_id","class_name"],"title":"AssignmentClassScheduleOut","description":"One class's planning of a devoir, placed in its school year."},"AssignmentClassSchedulesResponse":{"properties":{"status":{"type":"string","title":"Status"},"class_schedules":{"items":{"$ref":"#/components/schemas/AssignmentClassScheduleOut"},"type":"array","title":"Class Schedules"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"}},"type":"object","required":["status","class_schedules"],"title":"AssignmentClassSchedulesResponse"},"AssignmentContext":{"properties":{},"type":"object","title":"AssignmentContext"},"AssignmentDetailResponse":{"properties":{"assignment":{"$ref":"#/components/schemas/AssignmentInfo"},"exercises":{"items":{"$ref":"#/components/schemas/ExerciseDetails"},"type":"array","title":"Exercises"},"student_sessions":{"items":{"$ref":"#/components/schemas/StudentSessionDetails"},"type":"array","title":"Student Sessions"},"average_duration_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Duration Minutes"}},"type":"object","required":["assignment","exercises","student_sessions"],"title":"AssignmentDetailResponse"},"AssignmentDetailsResponse":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"class_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Name"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"},"is_overdue":{"type":"boolean","title":"Is Overdue","default":false},"typing_enabled":{"type":"boolean","title":"Typing Enabled","default":true},"typed_work_allowed":{"type":"boolean","title":"Typed Work Allowed","default":false},"autonomy_mode":{"type":"boolean","title":"Autonomy Mode","default":false},"autonomy_attempts_before_solution":{"type":"integer","title":"Autonomy Attempts Before Solution","default":1},"chat_policy":{"additionalProperties":{"type":"string"},"type":"object","title":"Chat Policy"},"chat_scoring_policy":{"additionalProperties":{"type":"integer"},"type":"object","title":"Chat Scoring Policy"},"retry_policy":{"additionalProperties":{"type":"integer"},"type":"object","title":"Retry Policy"},"justification_required":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Justification Required"},"partial_grade_percentage":{"type":"number","title":"Partial Grade Percentage","default":50.0}},"type":"object","required":["assignment_id"],"title":"AssignmentDetailsResponse"},"AssignmentExerciseDetailResponse":{"properties":{"id":{"type":"string","title":"Id"},"source":{"type":"string","enum":["teacher","public","calcul_template","annale","unknown"],"title":"Source","default":"unknown"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"type":"string","title":"Content","default":""},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution"},"themes":{"items":{"type":"string"},"type":"array","title":"Themes"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"solution_figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Figure Id"},"figure_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Solution"},"figures":{"items":{"type":"string"},"type":"array","title":"Figures"},"figures_solution":{"items":{"type":"string"},"type":"array","title":"Figures Solution"},"source_annales_exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Annales Exercise Id"},"retry_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry Limit"},"chat_policy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Policy"},"chat_scoring_weight":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Chat Scoring Weight"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id"],"title":"AssignmentExerciseDetailResponse"},"AssignmentExerciseStub":{"properties":{"id":{"type":"string","title":"Id"},"order":{"type":"integer","title":"Order"},"source":{"type":"string","enum":["teacher","public","calcul_template","annale","unknown"],"title":"Source","default":"unknown"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"original_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Id"},"source_public_exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Public Exercise Id"},"source_annales_exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Annales Exercise Id"}},"type":"object","required":["id","order"],"title":"AssignmentExerciseStub"},"AssignmentInfo":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"grade":{"anyOf":[{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},{"type":"null"}],"title":"Grade"},"school_year":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Year"},"class_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"},"class_ids":{"items":{"type":"string"},"type":"array","title":"Class Ids"},"class_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Name"},"class_names":{"items":{"type":"string"},"type":"array","title":"Class Names"},"teacher_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Id"},"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"},"status":{"type":"string","enum":["draft","active","finished"],"title":"Status","default":"draft"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"},"class_schedules":{"items":{"$ref":"#/components/schemas/AssignmentClassScheduleOut"},"type":"array","title":"Class Schedules"},"binary_grading":{"type":"boolean","title":"Binary Grading","default":false},"randomize_order":{"type":"boolean","title":"Randomize Order","default":true},"typing_enabled":{"type":"boolean","title":"Typing Enabled","default":true},"typed_work_allowed":{"type":"boolean","title":"Typed Work Allowed","default":false},"autonomy_mode":{"type":"boolean","title":"Autonomy Mode","default":false},"autonomy_attempts_before_solution":{"type":"integer","title":"Autonomy Attempts Before Solution","default":1},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"chat_policy":{"additionalProperties":{"type":"string"},"type":"object","title":"Chat Policy"},"chat_scoring_policy":{"additionalProperties":{"type":"integer"},"type":"object","title":"Chat Scoring Policy"},"retry_policy":{"additionalProperties":{"type":"integer"},"type":"object","title":"Retry Policy"},"justification_required":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Justification Required"},"partial_grade_percentage":{"type":"number","title":"Partial Grade Percentage","default":50.0},"remediation_source_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remediation Source Id"},"remediation_source_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remediation Source Title"}},"type":"object","required":["id","title","exercise_ids","created_at","updated_at"],"title":"AssignmentInfo"},"AssignmentMetricsSummary":{"properties":{"high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High Rating Rate"},"ratings_count":{"type":"integer","title":"Ratings Count"},"ratings_total":{"type":"integer","title":"Ratings Total"},"total_assignments":{"type":"integer","title":"Total Assignments"},"assignments_previous_month":{"type":"integer","title":"Assignments Previous Month"},"assignments_increase":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Assignments Increase"},"draft_count":{"type":"integer","title":"Draft Count"},"active_count":{"type":"integer","title":"Active Count"},"finished_count":{"type":"integer","title":"Finished Count"},"draft_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Draft Ratio"},"active_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Active Ratio"},"finished_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Finished Ratio"},"zero_class_count":{"type":"integer","title":"Zero Class Count"},"zero_class_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zero Class Ratio"},"multi_class_count":{"type":"integer","title":"Multi Class Count"},"multi_class_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Multi Class Ratio"},"total_exercises_used":{"type":"integer","title":"Total Exercises Used"},"exercises_previous_month":{"type":"integer","title":"Exercises Previous Month"},"exercises_increase":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Exercises Increase"},"exercise_type_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Exercise Type Breakdown"},"exercise_import_method_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Exercise Import Method Breakdown"},"exercise_source_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Exercise Source Breakdown"},"total_corrected_exercises":{"type":"integer","title":"Total Corrected Exercises"}},"type":"object","required":["high_rating_rate","ratings_count","ratings_total","total_assignments","assignments_previous_month","assignments_increase","draft_count","active_count","finished_count","draft_ratio","active_ratio","finished_ratio","zero_class_count","zero_class_ratio","multi_class_count","multi_class_ratio","total_exercises_used","exercises_previous_month","exercises_increase","exercise_type_breakdown","exercise_import_method_breakdown","exercise_source_breakdown","total_corrected_exercises"],"title":"AssignmentMetricsSummary"},"AssignmentSummary":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"},"completed_count":{"type":"integer","title":"Completed Count","default":0},"total_students":{"type":"integer","title":"Total Students","default":0},"average_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Score"}},"type":"object","required":["id","title"],"title":"AssignmentSummary"},"AssignmentSummaryResponse":{"properties":{"assignment":{"$ref":"#/components/schemas/AssignmentInfo"},"exercises":{"items":{"$ref":"#/components/schemas/AssignmentExerciseStub"},"type":"array","title":"Exercises"}},"type":"object","required":["assignment","exercises"],"title":"AssignmentSummaryResponse"},"AttachResponse":{"properties":{"status":{"type":"string","enum":["attached","no_b2b","pending_review","ignored","none"],"title":"Status"},"school":{"anyOf":[{"$ref":"#/components/schemas/SchoolSummary"},{"type":"null"}]},"french_school":{"anyOf":[{"$ref":"#/components/schemas/FrenchSchoolSummary"},{"type":"null"}]}},"type":"object","required":["status"],"title":"AttachResponse"},"AttachToSchoolAction":{"properties":{"action":{"type":"string","const":"attach_to_school","title":"Action"},"school_id":{"type":"string","title":"School Id"}},"type":"object","required":["action","school_id"],"title":"AttachToSchoolAction"},"AttachmentHints":{"properties":{"domain_school":{"anyOf":[{"$ref":"#/components/schemas/SchoolSummary"},{"type":"null"}]},"same_establishment_teachers":{"type":"integer","title":"Same Establishment Teachers","default":0},"suggestions":{"items":{"$ref":"#/components/schemas/FrenchSchoolSuggestion"},"type":"array","title":"Suggestions"},"suggested_email_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Email Domain"}},"type":"object","title":"AttachmentHints"},"AttemptItem":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"user_id":{"type":"string","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"posted_at":{"type":"string","format":"date-time","title":"Posted At"},"grading_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grading Status"},"latency_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latency Seconds"},"photo_count":{"type":"integer","title":"Photo Count"},"photo_urls":{"items":{"type":"string"},"type":"array","title":"Photo Urls"},"scope":{"type":"string","enum":["exercise","session"],"title":"Scope"},"scope_source":{"type":"string","enum":["explicit","inferred"],"title":"Scope Source"},"device_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Type"},"correctness":{"type":"string","title":"Correctness"},"computed_grade":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Computed Grade"},"max_grade":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Grade"},"grading_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grading Error"},"assignment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id"}},"type":"object","required":["session_id","exercise_id","user_id","posted_at","photo_count","photo_urls","scope","scope_source","correctness"],"title":"AttemptItem"},"AttemptResponse":{"properties":{"id":{"type":"string","title":"Id"},"quiz_id":{"type":"string","title":"Quiz Id"},"student_id":{"type":"string","title":"Student Id"},"course_id":{"type":"string","title":"Course Id"},"assignment_id":{"type":"string","title":"Assignment Id"},"status":{"type":"string","title":"Status"},"score_out_of_20":{"type":"number","title":"Score Out Of 20"},"correct_count":{"type":"integer","title":"Correct Count"},"total_questions":{"type":"integer","title":"Total Questions"},"attempt_number":{"type":"integer","title":"Attempt Number"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"answers":{"items":{"$ref":"#/components/schemas/QuizAnswerRecord"},"type":"array","title":"Answers"}},"type":"object","required":["id","quiz_id","student_id","course_id","assignment_id","status","score_out_of_20","correct_count","total_questions","attempt_number","started_at"],"title":"AttemptResponse","description":"Response for a quiz attempt."},"AttemptsPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AttemptItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["items","total","page","page_size"],"title":"AttemptsPage"},"AudioTranscriptionRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"AudioTranscriptionRequest","description":"Request model for audio transcription."},"AudioUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"AudioUploadRequest"},"AudioUploadResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"transcript":{"type":"string","title":"Transcript"}},"type":"object","required":["status","message","transcript"],"title":"AudioUploadResponse"},"AutoAssignBody":{"properties":{"exclude_pages":{"items":{"type":"integer"},"type":"array","title":"Exclude Pages","default":[]}},"type":"object","title":"AutoAssignBody"},"AutoSaveResponse":{"properties":{"status":{"type":"string","title":"Status","default":"success"},"message":{"type":"string","title":"Message","default":"Updated successfully"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"exercise_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exercise Ids"},"exercises":{"anyOf":[{"items":{"$ref":"#/components/schemas/AssignmentExerciseStub"},"type":"array"},{"type":"null"}],"title":"Exercises"},"added_exercises":{"anyOf":[{"items":{"$ref":"#/components/schemas/AssignmentExerciseStub"},"type":"array"},{"type":"null"}],"title":"Added Exercises"},"removed_exercise_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Removed Exercise Ids"},"new_exercise_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"New Exercise Ids"},"imported_exercises":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Imported Exercises"}},"type":"object","required":["updated_at"],"title":"AutoSaveResponse"},"BadgeCategory":{"type":"string","enum":["exercises_completed","chat_messages_sent","exercises_rated_or_noted","streak_days"],"title":"BadgeCategory"},"BadgeDefinition":{"properties":{"_id":{"type":"string","title":"Id"},"category":{"$ref":"#/components/schemas/BadgeCategory"},"tier":{"type":"integer","title":"Tier"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"threshold":{"type":"integer","title":"Threshold"},"xp_reward":{"type":"integer","title":"Xp Reward"},"image_url":{"type":"string","title":"Image Url","default":"placeholder.png"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["category","tier","name","description","threshold","xp_reward"],"title":"BadgeDefinition","description":"Defines a badge that can be earned by users"},"BadgeDefinitionCreate":{"properties":{"_id":{"type":"string","title":"Id"},"category":{"$ref":"#/components/schemas/BadgeCategory"},"tier":{"type":"integer","title":"Tier"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"threshold":{"type":"integer","title":"Threshold"},"xp_reward":{"type":"integer","title":"Xp Reward"},"image_url":{"type":"string","title":"Image Url","default":"placeholder.png"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["category","tier","name","description","threshold","xp_reward"],"title":"BadgeDefinitionCreate"},"BadgeDefinitionResponse":{"properties":{"id":{"type":"string","title":"Id"},"category":{"$ref":"#/components/schemas/BadgeCategory"},"tier":{"type":"integer","title":"Tier"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"threshold":{"type":"integer","title":"Threshold"},"xp_reward":{"type":"integer","title":"Xp Reward"},"image_url":{"type":"string","title":"Image Url"}},"type":"object","required":["id","category","tier","name","description","threshold","xp_reward","image_url"],"title":"BadgeDefinitionResponse"},"BadgeDefinitionUpdate":{"properties":{"_id":{"type":"string","title":"Id"},"category":{"$ref":"#/components/schemas/BadgeCategory"},"tier":{"type":"integer","title":"Tier"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"threshold":{"type":"integer","title":"Threshold"},"xp_reward":{"type":"integer","title":"Xp Reward"},"image_url":{"type":"string","title":"Image Url","default":"placeholder.png"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["category","tier","name","description","threshold","xp_reward"],"title":"BadgeDefinitionUpdate"},"Base64ImageUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"Base64ImageUploadRequest"},"Base64PDFUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type","default":"application/pdf"}},"type":"object","required":["file_content","file_name"],"title":"Base64PDFUploadRequest"},"Base64WordUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type","default":"application/vnd.openxmlformats-officedocument.wordprocessingml.document"}},"type":"object","required":["file_content","file_name"],"title":"Base64WordUploadRequest"},"BatchReformatResult":{"properties":{"id":{"type":"string","title":"Id"},"reformatted_text":{"type":"string","title":"Reformatted Text"}},"type":"object","required":["id","reformatted_text"],"title":"BatchReformatResult"},"BatchUpdateSchoolLevelRequest":{"properties":{"school_level":{"type":"string","title":"School Level","description":"School level to set: 'Terminale', 'Première', or 'Brevet'"},"exercise_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exercise Ids","description":"Specific exercise IDs to update. If None, uses filter criteria."},"year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"},"session":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"source_annale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Annale"}},"type":"object","required":["school_level"],"title":"BatchUpdateSchoolLevelRequest","description":"Request model for batch-setting schoolLevel on exercises."},"BatchUpdateSchoolLevelResponse":{"properties":{"updated_count":{"type":"integer","title":"Updated Count"},"message":{"type":"string","title":"Message"}},"type":"object","required":["updated_count","message"],"title":"BatchUpdateSchoolLevelResponse"},"BatchUploadMetricsSummary":{"properties":{"total_uploads":{"type":"integer","title":"Total Uploads"},"avg_exercises_per_upload":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Exercises Per Upload"},"avg_photos_per_upload":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Photos Per Upload"},"unique_users":{"type":"integer","title":"Unique Users"},"high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High Rating Rate"},"ratings_count":{"type":"integer","title":"Ratings Count"}},"type":"object","required":["total_uploads","avg_exercises_per_upload","avg_photos_per_upload","unique_users","high_rating_rate","ratings_count"],"title":"BatchUploadMetricsSummary"},"BatchUploadReviewItem":{"properties":{"id":{"type":"string","title":"Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"rating":{"type":"integer","title":"Rating"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_email","rating","created_at"],"title":"BatchUploadReviewItem"},"BatchUploadTrackPayload":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exercise_count":{"type":"integer","title":"Exercise Count"},"photo_count":{"type":"integer","title":"Photo Count"}},"type":"object","required":["session_id","exercise_count","photo_count"],"title":"BatchUploadTrackPayload"},"Body_add_missing_copy_copy_correction__session_id__add_missing_copy_post":{"properties":{"student_id":{"type":"string","title":"Student Id"},"student_name":{"type":"string","title":"Student Name"},"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["student_id","student_name","files"],"title":"Body_add_missing_copy_copy_correction__session_id__add_missing_copy_post"},"Body_authorize_post_oauth_authorize_post":{"properties":{"state_token":{"type":"string","title":"State Token"},"decision":{"type":"string","title":"Decision"}},"type":"object","required":["state_token","decision"],"title":"Body_authorize_post_oauth_authorize_post"},"Body_check_version_app_versions_check_post":{"properties":{"current_version":{"type":"string","title":"Current Version"},"platform":{"type":"string","title":"Platform","default":"all"}},"type":"object","required":["current_version"],"title":"Body_check_version_app_versions_check_post"},"Body_token_oauth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"redirect_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Uri"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"code_verifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Verifier"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"}},"type":"object","required":["grant_type"],"title":"Body_token_oauth_token_post"},"Body_update_teacher_establishment_admin_teachers__teacher_id__update_establishment_patch":{"properties":{"establishment":{"type":"string","title":"Establishment"}},"type":"object","required":["establishment"],"title":"Body_update_teacher_establishment_admin_teachers__teacher_id__update_establishment_patch"},"Body_upload_pdf_copy_correction__session_id__upload_pdf_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"upload_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upload Mode"}},"type":"object","required":["file"],"title":"Body_upload_pdf_copy_correction__session_id__upload_pdf_post"},"Body_upload_schools_csv_schools_admin_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_schools_csv_schools_admin_upload_post"},"BrFixApplyRequest":{"properties":{"exercise_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exercise Ids","description":"Specific IDs to fix. If None, fix all affected."}},"type":"object","title":"BrFixApplyRequest"},"BrFixApplyResponse":{"properties":{"fixed_count":{"type":"integer","title":"Fixed Count"}},"type":"object","required":["fixed_count"],"title":"BrFixApplyResponse"},"BrFixPreviewItem":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"title":{"type":"string","title":"Title"},"source_annale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Annale"},"content_has_fix":{"type":"boolean","title":"Content Has Fix"},"content_before":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Before"},"content_after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content After"},"solution_has_fix":{"type":"boolean","title":"Solution Has Fix"},"solution_before":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Before"},"solution_after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution After"}},"type":"object","required":["exercise_id","title","content_has_fix","solution_has_fix"],"title":"BrFixPreviewItem"},"BrFixPreviewResponse":{"properties":{"total_affected":{"type":"integer","title":"Total Affected"},"exercises":{"items":{"$ref":"#/components/schemas/BrFixPreviewItem"},"type":"array","title":"Exercises"}},"type":"object","required":["total_affected","exercises"],"title":"BrFixPreviewResponse"},"BugReportAnnotation":{"properties":{"comment":{"type":"string","title":"Comment"},"x":{"type":"number","title":"X"},"y":{"type":"number","title":"Y"},"width":{"type":"number","title":"Width"},"height":{"type":"number","title":"Height"},"selector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selector"},"test_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Id"},"element_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Element Html"}},"type":"object","required":["comment","x","y","width","height"],"title":"BugReportAnnotation","description":"One box the reporter drew, plus what sits underneath it.\n\nCoordinates are CSS pixels in *page* space (viewport position + scroll\noffset), not viewport space, so they line up with the full-page screenshot\nregardless of where the reporter had scrolled to. `document_width` /\n`document_height` on the context give the frame these are measured in."},"BugReportContext":{"properties":{"url":{"type":"string","title":"Url"},"route":{"type":"string","title":"Route"},"user_agent":{"type":"string","title":"User Agent"},"viewport_width":{"type":"integer","title":"Viewport Width"},"viewport_height":{"type":"integer","title":"Viewport Height"},"document_width":{"type":"integer","title":"Document Width"},"document_height":{"type":"integer","title":"Document Height"},"scroll_x":{"type":"integer","title":"Scroll X","default":0},"scroll_y":{"type":"integer","title":"Scroll Y","default":0},"device_pixel_ratio":{"type":"number","title":"Device Pixel Ratio","default":1.0},"is_mobile":{"type":"boolean","title":"Is Mobile","default":false},"app_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Version"},"posthog_replay_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Posthog Replay Url"},"sentry_replay_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sentry Replay Id"},"console":{"items":{"$ref":"#/components/schemas/ConsoleEntry"},"type":"array","title":"Console"},"network":{"items":{"$ref":"#/components/schemas/NetworkEntry"},"type":"array","title":"Network"}},"type":"object","required":["url","route","user_agent","viewport_width","viewport_height","document_width","document_height"],"title":"BugReportContext","description":"Everything the client could observe at the moment the report was sent."},"BugReportCreate":{"properties":{"annotations":{"items":{"$ref":"#/components/schemas/BugReportAnnotation"},"type":"array","title":"Annotations"},"context":{"$ref":"#/components/schemas/BugReportContext"},"screenshot_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot Base64"}},"type":"object","required":["annotations","context"],"title":"BugReportCreate"},"BugReportListResponse":{"properties":{"reports":{"items":{"$ref":"#/components/schemas/BugReportSummaryResponse"},"type":"array","title":"Reports"}},"type":"object","title":"BugReportListResponse"},"BugReportResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"reporter_id":{"type":"string","title":"Reporter Id"},"reporter_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reporter Email"},"annotations":{"items":{"$ref":"#/components/schemas/BugReportAnnotation"},"type":"array","title":"Annotations"},"context":{"$ref":"#/components/schemas/BugReportContext"},"screenshot_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot Url"},"status":{"type":"string","enum":["open","resolved"],"title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"}},"type":"object","required":["id","title","reporter_id","annotations","context","status","created_at"],"title":"BugReportResponse"},"BugReportSummaryResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"reporter_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reporter Email"},"route":{"type":"string","title":"Route"},"status":{"type":"string","enum":["open","resolved"],"title":"Status"},"annotation_count":{"type":"integer","title":"Annotation Count"},"console_error_count":{"type":"integer","title":"Console Error Count"},"failed_request_count":{"type":"integer","title":"Failed Request Count"},"has_screenshot":{"type":"boolean","title":"Has Screenshot"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","title","route","status","annotation_count","console_error_count","failed_request_count","has_screenshot","created_at"],"title":"BugReportSummaryResponse","description":"List view. Deliberately drops the console and network buffers: a listing\nof 50 reports carrying full buffers is unreadable, and the agent fetches the\ndetail of the one it cares about anyway."},"BulkMoveExercisesInput":{"properties":{"exercise_ids":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Exercise Ids"},"category_path":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Category Path"}},"type":"object","required":["exercise_ids","category_path"],"title":"BulkMoveExercisesInput"},"BusinessFinanceSettingsResponse":{"properties":{"burn_rate_eur_monthly":{"type":"number","title":"Burn Rate Eur Monthly"},"cash_on_hand_eur":{"type":"number","title":"Cash On Hand Eur"},"runway_months":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Runway Months"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"updated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated By"}},"type":"object","required":["burn_rate_eur_monthly","cash_on_hand_eur","updated_at"],"title":"BusinessFinanceSettingsResponse"},"BusinessFinanceSettingsUpdateRequest":{"properties":{"burn_rate_eur_monthly":{"type":"number","minimum":0.0,"title":"Burn Rate Eur Monthly"},"cash_on_hand_eur":{"type":"number","minimum":0.0,"title":"Cash On Hand Eur"}},"type":"object","required":["burn_rate_eur_monthly","cash_on_hand_eur"],"title":"BusinessFinanceSettingsUpdateRequest"},"CPGEExerciseCreate":{"properties":{"filiere":{"type":"string","title":"Filiere"},"banque":{"type":"string","title":"Banque"},"type_exercice":{"type":"string","title":"Type Exercice"},"content":{"type":"string","title":"Content"},"solution":{"type":"string","title":"Solution"},"figure_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Solution"},"hints1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints1"},"hints2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints2"},"hints3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints3"}},"type":"object","required":["filiere","banque","type_exercice","content","solution"],"title":"CPGEExerciseCreate"},"CPGEExerciseOut":{"properties":{"id":{"type":"string","title":"Id"},"filiere":{"type":"string","title":"Filiere"},"banque":{"type":"string","title":"Banque"},"type_exercice":{"type":"string","title":"Type Exercice"},"content":{"type":"string","title":"Content"},"solution":{"type":"string","title":"Solution"},"figure_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Solution"},"hints1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints1"},"hints2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints2"},"hints3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints3"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","filiere","banque","type_exercice","content","solution","created_at","updated_at"],"title":"CPGEExerciseOut"},"CPGEExerciseUpdate":{"properties":{"filiere":{"type":"string","title":"Filiere"},"banque":{"type":"string","title":"Banque"},"type_exercice":{"type":"string","title":"Type Exercice"},"content":{"type":"string","title":"Content"},"solution":{"type":"string","title":"Solution"},"figure_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Solution"},"hints1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints1"},"hints2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints2"},"hints3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints3"}},"type":"object","required":["filiere","banque","type_exercice","content","solution"],"title":"CPGEExerciseUpdate"},"CPGESolutionAttempt":{"properties":{"latex_content":{"type":"string","title":"Latex Content"},"image_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Image Urls"},"diagram_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Diagram Urls"}},"type":"object","required":["latex_content"],"title":"CPGESolutionAttempt"},"CPGESolutionCheckResponse":{"properties":{"status":{"type":"string","title":"Status"},"correctness":{"type":"string","enum":["correct","partial","wrong","not_applicable"],"title":"Correctness"},"feedback":{"type":"string","title":"Feedback"}},"type":"object","required":["status","correctness","feedback"],"title":"CPGESolutionCheckResponse"},"CSATCategoryRequest":{"properties":{"feedback_id":{"type":"string","title":"Feedback Id"},"category":{"type":"string","title":"Category"}},"type":"object","required":["feedback_id","category"],"title":"CSATCategoryRequest"},"CSATDetailItem":{"properties":{"user_id":{"type":"string","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Name"},"rating":{"type":"integer","title":"Rating"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Name"}},"type":"object","required":["user_id","user_email","user_name","rating","created_at","school_name"],"title":"CSATDetailItem"},"CSATFeedbackRequest":{"properties":{"csat_type":{"type":"string","enum":["transcription","transcription_figure","transcription_correction","correction","assignment","batch_upload","home_redesign_v2","chat_redesign_v1","mobile_toolbar_redesign_v1","chat_message_satisfaction","copy_correction_upload","copy_correction_grading","student_copy_viewing","student_dm_results_v25","student_answer_submission_v25","teacher_dm_results_v25","figure_generation","student_practice_picker_v1","student_progression_v1","teacher_physics_library_v1"],"title":"Csat Type"},"rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Rating"},"device_type":{"type":"string","title":"Device Type"},"prompt_index":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Prompt Index"},"context":{"anyOf":[{"$ref":"#/components/schemas/TranscriptionContext"},{"$ref":"#/components/schemas/TranscriptionCorrectionContext"},{"$ref":"#/components/schemas/CorrectionContext"},{"$ref":"#/components/schemas/ChatRedesignContext"},{"$ref":"#/components/schemas/ChatMessageSatisfactionContext"},{"$ref":"#/components/schemas/FigureGenerationContext"},{"$ref":"#/components/schemas/AssignmentContext"},{"$ref":"#/components/schemas/StudentDmResultsV25Context"},{"$ref":"#/components/schemas/StudentAnswerSubmissionV25Context"},{"$ref":"#/components/schemas/TeacherDmResultsV25Context"},{"$ref":"#/components/schemas/StudentPracticePickerV1Context"},{"$ref":"#/components/schemas/TeacherPhysicsLibraryV1Context"},{"additionalProperties":true,"type":"object"}],"title":"Context"}},"type":"object","required":["csat_type","rating","device_type","context"],"title":"CSATFeedbackRequest"},"CSATFeedbackResponse":{"properties":{"feedback_id":{"type":"string","title":"Feedback Id"}},"type":"object","required":["feedback_id"],"title":"CSATFeedbackResponse"},"CSATPromptRequest":{"properties":{"csat_type":{"type":"string","enum":["transcription","transcription_figure","transcription_correction","correction","assignment","batch_upload","home_redesign_v2","chat_redesign_v1","mobile_toolbar_redesign_v1","chat_message_satisfaction","copy_correction_upload","copy_correction_grading","student_copy_viewing","student_dm_results_v25","student_answer_submission_v25","teacher_dm_results_v25","figure_generation","student_practice_picker_v1","student_progression_v1","teacher_physics_library_v1"],"title":"Csat Type"}},"type":"object","required":["csat_type"],"title":"CSATPromptRequest"},"CSATPromptResponse":{"properties":{"should_prompt":{"type":"boolean","title":"Should Prompt"},"prompt_index":{"type":"integer","title":"Prompt Index"}},"type":"object","required":["should_prompt","prompt_index"],"title":"CSATPromptResponse"},"CalculVariation":{"properties":{"content":{"type":"string","title":"Content"},"solution":{"type":"string","title":"Solution"}},"type":"object","required":["content","solution"],"title":"CalculVariation"},"CategoryInfo":{"properties":{"name":{"type":"string","title":"Name"},"path":{"items":{"type":"string"},"type":"array","title":"Path"},"template_count":{"type":"integer","title":"Template Count"},"children":{"items":{"$ref":"#/components/schemas/CategoryInfo"},"type":"array","title":"Children"}},"type":"object","required":["name","path","template_count"],"title":"CategoryInfo","description":"Category information for the tree structure"},"CategoryNode":{"properties":{"name":{"type":"string","title":"Name"},"path":{"items":{"type":"string"},"type":"array","title":"Path"},"exercise_count":{"type":"integer","title":"Exercise Count"},"children":{"items":{"$ref":"#/components/schemas/CategoryNode"},"type":"array","title":"Children"}},"type":"object","required":["name","path","exercise_count"],"title":"CategoryNode","description":"Node in the category tree; counts are cumulative (include descendants)."},"CategoryPathUpdate":{"properties":{"category_path":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Category Path"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"}},"type":"object","required":["category_path"],"title":"CategoryPathUpdate"},"ChangeRequestInfo":{"properties":{"template_id":{"type":"string","title":"Template Id"},"title":{"type":"string","title":"Title"},"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path"},"reason":{"type":"string","title":"Reason"},"proposed_changes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Proposed Changes"}},"type":"object","required":["template_id","title","category_path","reason","proposed_changes"],"title":"ChangeRequestInfo","description":"Info about a pending change request"},"ChangeRequestListResponse":{"properties":{"total":{"type":"integer","title":"Total"},"change_requests":{"items":{"$ref":"#/components/schemas/ChangeRequestInfo"},"type":"array","title":"Change Requests"}},"type":"object","required":["total","change_requests"],"title":"ChangeRequestListResponse","description":"Response with list of pending change requests"},"ChapitreCreate":{"properties":{"name":{"type":"string","minLength":1,"title":"Name"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order","default":0}},"type":"object","required":["name"],"title":"ChapitreCreate","description":"Request model for creating a holiday course chapitre"},"ChapitreDetailResponse":{"properties":{"chapitre_id":{"type":"string","title":"Chapitre Id","description":"Chapter ID"},"chapitre_name":{"type":"string","title":"Chapitre Name","description":"Chapter name"},"students_progress":{"items":{"$ref":"#/components/schemas/StudentProgressInChapitre"},"type":"array","title":"Students Progress","description":"List of student progress details"}},"type":"object","required":["chapitre_id","chapitre_name","students_progress"],"title":"ChapitreDetailResponse","description":"Detailed progress response for a specific chapter."},"ChapitreResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"classe_id":{"type":"string","title":"Classe Id"},"order":{"type":"integer","title":"Order"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","classe_id","order","created_at","updated_at"],"title":"ChapitreResponse","description":"Response model for holiday course chapitre"},"ChapitreStats":{"properties":{"chapitre_id":{"type":"string","title":"Chapitre Id","description":"Chapter ID"},"chapitre_name":{"type":"string","title":"Chapitre Name","description":"Chapter name"},"students_started":{"type":"integer","title":"Students Started","description":"Number of students who started this chapter"},"average_progress_percentage":{"type":"number","title":"Average Progress Percentage","description":"Average progress percentage for this chapter"},"most_difficult_sub_chapitre":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Most Difficult Sub Chapitre","description":"Most difficult sub-chapter with failure rate"}},"type":"object","required":["chapitre_id","chapitre_name","students_started","average_progress_percentage"],"title":"ChapitreStats","description":"Statistics for a specific chapter."},"ChapitreUpdate":{"properties":{"name":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Name"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order"}},"type":"object","title":"ChapitreUpdate","description":"Request model for updating a holiday course chapitre"},"ChapitreWithSubChapitres":{"properties":{"chapitre_id":{"type":"string","title":"Chapitre Id"},"chapitre_name":{"type":"string","title":"Chapitre Name"},"chapitre_order":{"type":"integer","title":"Chapitre Order"},"sub_chapitres":{"items":{"$ref":"#/components/schemas/SubChapitreWithProgress"},"type":"array","title":"Sub Chapitres"}},"type":"object","required":["chapitre_id","chapitre_name","chapitre_order","sub_chapitres"],"title":"ChapitreWithSubChapitres","description":"Model for a chapitre with all its sub-chapitres and progress."},"Chapter":{"properties":{"display":{"type":"string","title":"Display"},"legacy_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legacy Slug"},"sort_order":{"type":"integer","title":"Sort Order","default":0},"thematics":{"items":{"$ref":"#/components/schemas/Thematic"},"type":"array","title":"Thematics"},"curriculum_details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Curriculum Details"}},"type":"object","required":["display"],"title":"Chapter"},"ChapterInfo":{"properties":{"tag_id":{"type":"string","title":"Tag Id"},"title":{"type":"string","title":"Title"}},"type":"object","required":["tag_id","title"],"title":"ChapterInfo"},"ChapterInput":{"properties":{"display":{"type":"string","minLength":1,"title":"Display"},"legacy_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legacy Slug"},"sort_order":{"type":"integer","title":"Sort Order","default":0},"thematics":{"items":{"$ref":"#/components/schemas/ThematicInput"},"type":"array","title":"Thematics"},"curriculum_details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Curriculum Details"}},"type":"object","required":["display"],"title":"ChapterInput"},"ChapterLink":{"properties":{"grade_key":{"type":"string","minLength":1,"title":"Grade Key"},"chapter_display":{"type":"string","minLength":1,"title":"Chapter Display"}},"type":"object","required":["grade_key","chapter_display"],"title":"ChapterLink"},"ChapterMasteryResponse":{"properties":{"chapter":{"type":"string","title":"Chapter"},"evaluated_count":{"type":"integer","title":"Evaluated Count"},"class_mastery":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Class Mastery"},"is_fragile":{"type":"boolean","title":"Is Fragile"},"cells":{"items":{"$ref":"#/components/schemas/MasteryCellResponse"},"type":"array","title":"Cells"},"skills":{"items":{"$ref":"#/components/schemas/schemas__class_dashboard__mastery__SkillMasteryResponse"},"type":"array","title":"Skills"}},"type":"object","required":["chapter","evaluated_count","is_fragile","cells","skills"],"title":"ChapterMasteryResponse"},"ChapterProfilePointResponse":{"properties":{"chapter":{"type":"string","title":"Chapter"},"student_mastery":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Student Mastery"},"class_mastery":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Class Mastery"}},"type":"object","required":["chapter"],"title":"ChapterProfilePointResponse"},"ChapterProgress":{"properties":{"chapitre_id":{"type":"string","title":"Chapitre Id"},"chapitre_name":{"type":"string","title":"Chapitre Name"},"total_sub_chapitres":{"type":"integer","title":"Total Sub Chapitres"},"completed_sub_chapitres":{"type":"integer","title":"Completed Sub Chapitres"},"time_spent_seconds":{"type":"integer","title":"Time Spent Seconds"}},"type":"object","required":["chapitre_id","chapitre_name","total_sub_chapitres","completed_sub_chapitres","time_spent_seconds"],"title":"ChapterProgress","description":"Chapter-level progress summary."},"ChatAnalysisResponse":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"chat_insights":{"items":{"type":"string"},"type":"array","title":"Chat Insights"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"}},"type":"object","required":["exercise_id","chat_insights","generated_at"],"title":"ChatAnalysisResponse"},"ChatAudioMessageOut":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"},"user_id":{"type":"string","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Name"},"user_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Role"},"transcript":{"type":"string","title":"Transcript"},"audio_url":{"type":"string","title":"Audio Url"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"audio_uploaded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Audio Uploaded At"}},"type":"object","required":["chat_id","user_id","transcript","audio_url"],"title":"ChatAudioMessageOut"},"ChatAudioPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ChatAudioMessageOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["items","total","page","page_size"],"title":"ChatAudioPage"},"ChatCreateRequest":{"properties":{"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}},"type":"object","title":"ChatCreateRequest","description":"Optional creation payload — `origin` tags where the chat started."},"ChatCreateResponse":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["chat_id","created_at","updated_at"],"title":"ChatCreateResponse"},"ChatMessageCountResponse":{"properties":{"message_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Message Counts"}},"type":"object","required":["message_counts"],"title":"ChatMessageCountResponse"},"ChatMessageRequest":{"properties":{"message":{"type":"string","title":"Message"},"type":{"type":"string","enum":["text","image_url","image_description"],"title":"Type","default":"text"},"is_mobile":{"type":"boolean","title":"Is Mobile","default":false},"device_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Type"}},"type":"object","required":["message"],"title":"ChatMessageRequest"},"ChatMessageReviewItem":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"device_type":{"type":"string","title":"Device Type"},"rating":{"type":"integer","title":"Rating"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"prompt_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prompt Index"},"question":{"type":"string","title":"Question"},"chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id"},"previous_user_message_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous User Message Content"},"previous_user_message_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous User Message Type"},"assistant_message_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assistant Message Content"},"assistant_message_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assistant Message Type"}},"type":"object","required":["id","created_at","device_type","rating","question"],"title":"ChatMessageReviewItem"},"ChatMessageSatisfactionContext":{"properties":{"chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id"},"assistant_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assistant Message Id"},"assistant_message_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assistant Message Type"},"assistant_message_content":{"anyOf":[{"type":"string","maxLength":32000},{"type":"null"}],"title":"Assistant Message Content"},"previous_user_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous User Message Id"},"previous_user_message_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous User Message Type"},"previous_user_message_content":{"anyOf":[{"type":"string","maxLength":32000},{"type":"null"}],"title":"Previous User Message Content"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Id"},"course_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Course Id"},"cpge_exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cpge Exercise Id"},"course_route_kind":{"anyOf":[{"type":"string","enum":["my_course","assigned_course"]},{"type":"null"}],"title":"Course Route Kind"}},"type":"object","title":"ChatMessageSatisfactionContext"},"ChatMessageSatisfactionSummary":{"properties":{"high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High Rating Rate"},"ratings_count":{"type":"integer","title":"Ratings Count"},"category_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Category Breakdown"},"ratings_with_category":{"type":"integer","title":"Ratings With Category","default":0}},"type":"object","required":["high_rating_rate","ratings_count"],"title":"ChatMessageSatisfactionSummary"},"ChatMessagesResponse":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"conversation_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conversation History"}},"type":"object","required":["chat_id","conversation_history"],"title":"ChatMessagesResponse"},"ChatRedesignContext":{"properties":{"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page"}},"type":"object","title":"ChatRedesignContext"},"ChatRedesignHomeTourClaimResponse":{"properties":{"should_show":{"type":"boolean","title":"Should Show"}},"type":"object","required":["should_show"],"title":"ChatRedesignHomeTourClaimResponse"},"ChatRedesignMetricsSummary":{"properties":{"high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High Rating Rate"},"ratings_count":{"type":"integer","title":"Ratings Count"},"category_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Category Breakdown"},"ratings_with_category":{"type":"integer","title":"Ratings With Category","default":0}},"type":"object","required":["high_rating_rate","ratings_count"],"title":"ChatRedesignMetricsSummary"},"ChatRedesignReviewItem":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"device_type":{"type":"string","title":"Device Type"},"rating":{"type":"integer","title":"Rating"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"prompt_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prompt Index"},"question":{"type":"string","title":"Question"}},"type":"object","required":["id","created_at","device_type","rating","question"],"title":"ChatRedesignReviewItem"},"ChatRenameRequest":{"properties":{"title":{"type":"string","title":"Title"}},"type":"object","required":["title"],"title":"ChatRenameRequest"},"ChatSessionExerciseIn":{"properties":{"exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Id"},"enonce":{"type":"string","title":"Enonce","default":""},"solution":{"type":"string","title":"Solution","default":""}},"type":"object","title":"ChatSessionExerciseIn"},"ChatSummaryResponse":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"hidden_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Hidden At"},"message_count":{"type":"integer","title":"Message Count"},"last_message":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Last Message"},"last_user_context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Last User Context"},"user_context_kinds":{"items":{"type":"string","enum":["exercise","course"]},"type":"array","title":"User Context Kinds"}},"type":"object","required":["chat_id","created_at","updated_at","message_count"],"title":"ChatSummaryResponse"},"ChatTitleContextRequest":{"properties":{"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Id"},"course_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Course Id"},"course_route_kind":{"anyOf":[{"type":"string","enum":["my_course","assigned_course"]},{"type":"null"}],"title":"Course Route Kind"},"cpge_exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cpge Exercise Id"}},"type":"object","title":"ChatTitleContextRequest"},"ChatTitleGenerateRequest":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/ChatTitleMessageRequest"},"type":"array","title":"Messages"},"context":{"anyOf":[{"$ref":"#/components/schemas/ChatTitleContextRequest"},{"type":"null"}]}},"type":"object","required":["messages"],"title":"ChatTitleGenerateRequest"},"ChatTitleMessageRequest":{"properties":{"role":{"type":"string","enum":["user","student","assistant"],"title":"Role"},"content":{"type":"string","title":"Content"}},"type":"object","required":["role","content"],"title":"ChatTitleMessageRequest"},"ChatTranscriptMessage":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"role":{"type":"string","title":"Role"},"content":{"type":"string","title":"Content"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"tool_activity":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Tool Activity"},"context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Context"}},"type":"object","required":["role","content"],"title":"ChatTranscriptMessage"},"ChatTranscriptOut":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"user_id":{"type":"string","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"user_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Role"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"messages":{"items":{"$ref":"#/components/schemas/ChatTranscriptMessage"},"type":"array","title":"Messages"},"tool_events":{"items":{"$ref":"#/components/schemas/ToolCallEventOut"},"type":"array","title":"Tool Events"},"widget_events":{"items":{"$ref":"#/components/schemas/WidgetEventOut"},"type":"array","title":"Widget Events"}},"type":"object","required":["chat_id","user_id","messages","tool_events"],"title":"ChatTranscriptOut"},"CheckAudioSolutionRequest":{"properties":{"audio_base64_content":{"type":"string","title":"Audio Base64 Content"}},"type":"object","required":["audio_base64_content"],"title":"CheckAudioSolutionRequest","description":"Request model for checking audio solution with multimodal AI."},"CheckAudioSolutionResponse":{"properties":{"correctness":{"type":"string","enum":["passed","failed"],"title":"Correctness"},"feedback":{"type":"string","title":"Feedback"},"transcript":{"type":"string","title":"Transcript"}},"type":"object","required":["correctness","feedback","transcript"],"title":"CheckAudioSolutionResponse","description":"Response model for multimodal audio solution checking."},"CheckImageSolutionRequest":{"properties":{"image_base64_content":{"type":"string","title":"Image Base64 Content"}},"type":"object","required":["image_base64_content"],"title":"CheckImageSolutionRequest","description":"Request model for checking image solution with multimodal AI."},"CheckMultimodalSolutionResponse":{"properties":{"status":{"type":"string","title":"Status"},"overall_status":{"type":"string","enum":["passed","failed","not_understood"],"title":"Overall Status"},"results_by_question":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Results By Question"},"full_student_transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Student Transcript"},"message":{"type":"string","title":"Message"},"submission_quality":{"type":"string","enum":["ok","empty","illegible"],"title":"Submission Quality","default":"ok"}},"type":"object","required":["status","overall_status","results_by_question","message"],"title":"CheckMultimodalSolutionResponse","description":"Response model for multimodal solution checking with granular feedback."},"CheckoutSessionRequest":{"properties":{"basePriceId":{"type":"string","title":"Basepriceid"},"mentorQuantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mentorquantity","default":0},"promoCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promocode"}},"type":"object","required":["basePriceId"],"title":"CheckoutSessionRequest"},"ClassAppreciationResponse":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"text":{"type":"string","title":"Text"},"author_type":{"type":"string","enum":["ai","human"],"title":"Author Type"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"}},"type":"object","required":["assignment_id","text","author_type","generated_at"],"title":"ClassAppreciationResponse"},"ClassAttributionDetailItem":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"title":{"type":"string","title":"Title"},"teacher_email":{"type":"string","title":"Teacher Email"},"class_names":{"items":{"type":"string"},"type":"array","title":"Class Names"},"class_count":{"type":"integer","title":"Class Count"}},"type":"object","required":["assignment_id","title","teacher_email","class_names","class_count"],"title":"ClassAttributionDetailItem"},"ClassCodeLinkRequest":{"properties":{"class_code":{"type":"string","title":"Class Code"}},"type":"object","required":["class_code"],"title":"ClassCodeLinkRequest"},"ClassEvaluationsResponse":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"exercises":{"items":{"$ref":"#/components/schemas/ExerciseSummary"},"type":"array","title":"Exercises"},"rows":{"items":{"$ref":"#/components/schemas/EvaluationRow"},"type":"array","title":"Rows"},"student_breakdowns":{"items":{"$ref":"#/components/schemas/StudentSessionBreakdownResponse"},"type":"array","title":"Student Breakdowns"},"legacy_submissions":{"items":{"$ref":"#/components/schemas/LegacySubmissionRefResponse"},"type":"array","title":"Legacy Submissions"}},"type":"object","required":["assignment_id","exercises","rows","student_breakdowns","legacy_submissions"],"title":"ClassEvaluationsResponse"},"ClassFeedbackResponse":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"assignment_title":{"type":"string","title":"Assignment Title"},"class_name":{"type":"string","title":"Class Name"},"exercise_feedbacks":{"items":{"$ref":"#/components/schemas/ExerciseFeedback"},"type":"array","title":"Exercise Feedbacks"},"total_students":{"type":"integer","title":"Total Students"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"user_owns_assignment":{"type":"boolean","title":"User Owns Assignment","default":false}},"type":"object","required":["assignment_id","assignment_title","class_name","exercise_feedbacks","total_students","generated_at"],"title":"ClassFeedbackResponse"},"ClassJoinInfoResponse":{"properties":{"class_name":{"type":"string","title":"Class Name"},"teacher_name":{"type":"string","title":"Teacher Name"},"has_pending_students":{"type":"boolean","title":"Has Pending Students"},"pending_students":{"items":{"$ref":"#/components/schemas/PendingStudentInfo"},"type":"array","title":"Pending Students"},"matched_pending_student":{"anyOf":[{"$ref":"#/components/schemas/PendingStudentInfo"},{"type":"null"}]}},"type":"object","required":["class_name","teacher_name","has_pending_students","pending_students"],"title":"ClassJoinInfoResponse"},"ClassMasteryResponse":{"properties":{"class_name":{"type":"string","title":"Class Name"},"period":{"type":"string","title":"Period"},"students":{"items":{"$ref":"#/components/schemas/MasteryStudentResponse"},"type":"array","title":"Students"},"chapters":{"items":{"$ref":"#/components/schemas/ChapterMasteryResponse"},"type":"array","title":"Chapters"},"skills":{"items":{"$ref":"#/components/schemas/schemas__class_dashboard__mastery__SkillMasteryResponse"},"type":"array","title":"Skills"},"thresholds":{"$ref":"#/components/schemas/MasteryThresholdsResponse"}},"type":"object","required":["class_name","period","students","chapters","skills","thresholds"],"title":"ClassMasteryResponse","description":"Both views in one payload.\n\n`skills` is the same set of savoir-faire as the ones nested under\n`chapters`, re-sorted hardest-first across chapters for the \"par\nsavoir-faire\" toggle. Duplicating them costs a few hundred KB on a large\nclass and buys an instant toggle with no second request — the alternative\nis re-sorting client-side, which would put the ranking rule in two places."},"ClassOverviewResponse":{"properties":{"class_name":{"type":"string","title":"Class Name"},"period":{"type":"string","title":"Period"},"total_students":{"type":"integer","title":"Total Students"},"general_average":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"General Average"},"general_median":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"General Median"},"recent":{"items":{"$ref":"#/components/schemas/RecentActivityResponse"},"type":"array","title":"Recent"},"weights":{"additionalProperties":{"type":"number"},"type":"object","title":"Weights"}},"type":"object","required":["class_name","period","total_students","recent","weights"],"title":"ClassOverviewResponse","description":"`weights` carries the coefficients so the frontend can render the\n\"évaluations ×4, DM ×1, C.C. ×½\" tooltip from the same constant the average\nwas computed with, instead of restating the formula in French in a\ncomponent. It is not there for the client to recompute anything."},"ClassRemediationRequest":{"properties":{"class_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Class Ids"}},"type":"object","title":"ClassRemediationRequest"},"ClassRemediationResponse":{"properties":{"status":{"type":"string","title":"Status"},"assignment_id":{"type":"string","title":"Assignment Id"}},"type":"object","required":["status","assignment_id"],"title":"ClassRemediationResponse"},"ClassReworkResponse":{"properties":{"period":{"type":"string","title":"Period"},"students":{"items":{"$ref":"#/components/schemas/MasteryStudentResponse"},"type":"array","title":"Students"},"skills":{"items":{"$ref":"#/components/schemas/ReworkSkillResponse"},"type":"array","title":"Skills"},"mastery_threshold":{"type":"number","title":"Mastery Threshold"},"evaluated_students":{"type":"integer","title":"Evaluated Students"}},"type":"object","required":["period","students","skills","mastery_threshold","evaluated_students"],"title":"ClassReworkResponse","description":"An empty `skills` list means \"no class-level priority has emerged yet\",\nNOT \"all is well\" — most often the period simply has not been evaluated on\nenough students. `evaluated_students` is what lets the UI tell those two\napart and say so.\n\n`students` indexes the strips exactly as in the mastery payload, so the\nsame strip component renders both."},"ClassRowResponse":{"properties":{"general_mean":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"General Mean"},"general_median":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"General Median"},"by_type_mean":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"By Type Mean","default":{}},"by_type_median":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"By Type Median","default":{}},"devoirs_done_mean":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Devoirs Done Mean"},"devoirs_assigned":{"type":"integer","title":"Devoirs Assigned"},"controles_done_mean":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Controles Done Mean"},"controles_assigned":{"type":"integer","title":"Controles Assigned"},"autonomy_mean":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Autonomy Mean"},"autonomy_median":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Autonomy Median"}},"type":"object","required":["devoirs_assigned","controles_assigned"],"title":"ClassRowResponse"},"ClassStudentsTableResponse":{"properties":{"class_name":{"type":"string","title":"Class Name"},"period":{"type":"string","title":"Period"},"rows":{"items":{"$ref":"#/components/schemas/StudentRowResponse"},"type":"array","title":"Rows"},"class_row":{"anyOf":[{"$ref":"#/components/schemas/ClassRowResponse"},{"type":"null"}]},"total_students":{"type":"integer","title":"Total Students"},"active_students":{"type":"integer","title":"Active Students"},"evaluation_completion":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Evaluation Completion"},"devoir_completion":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Devoir Completion"},"controle_completion":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Controle Completion"},"weights":{"additionalProperties":{"type":"number"},"type":"object","title":"Weights"}},"type":"object","required":["class_name","period","rows","total_students","active_students","weights"],"title":"ClassStudentsTableResponse","description":"Completion ratios are 0..1, null when nothing of that type was assigned\n— the strip renders \"—\" rather than \"0 %\", which would read as the class\nfailing to do work nobody gave them."},"ClassSummaryItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"student_count":{"type":"integer","title":"Student Count"},"exercises_completed":{"type":"integer","title":"Exercises Completed"},"active_students":{"type":"integer","title":"Active Students"}},"type":"object","required":["id","name","student_count","exercises_completed","active_students"],"title":"ClassSummaryItem"},"ClassTableRow":{"properties":{"class_id":{"type":"string","title":"Class Id"},"class_name":{"type":"string","title":"Class Name"},"teacher_name":{"type":"string","title":"Teacher Name"},"student_count":{"type":"integer","title":"Student Count"},"courses_created":{"type":"integer","title":"Courses Created"},"exercise_sessions_practice":{"type":"integer","title":"Exercise Sessions Practice"},"exercise_sessions_assignment":{"type":"integer","title":"Exercise Sessions Assignment"},"ai_tutor_hours":{"type":"number","title":"Ai Tutor Hours"},"school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Name"}},"type":"object","required":["class_id","class_name","teacher_name","student_count","courses_created","exercise_sessions_practice","exercise_sessions_assignment","ai_tutor_hours"],"title":"ClassTableRow"},"ClasseCreate":{"properties":{"name":{"type":"string","minLength":1,"title":"Name"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order","default":0}},"type":"object","required":["name"],"title":"ClasseCreate","description":"Request model for creating a holiday course classe"},"ClasseResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"order":{"type":"integer","title":"Order"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","order","created_at","updated_at"],"title":"ClasseResponse","description":"Response model for holiday course classe"},"ClasseUpdate":{"properties":{"name":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Name"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order"}},"type":"object","title":"ClasseUpdate","description":"Request model for updating a holiday course classe"},"ClassesSummaryResponse":{"properties":{"classes":{"items":{"$ref":"#/components/schemas/ClassSummaryItem"},"type":"array","title":"Classes"},"period":{"type":"string","title":"Period"},"school_year":{"type":"string","title":"School Year"}},"type":"object","required":["classes","period","school_year"],"title":"ClassesSummaryResponse"},"ClientRegistrationRequest":{"properties":{"redirect_uris":{"items":{"type":"string"},"type":"array","title":"Redirect Uris"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"}},"type":"object","required":["redirect_uris"],"title":"ClientRegistrationRequest"},"CompleteAttemptResponse":{"properties":{"id":{"type":"string","title":"Id"},"score_out_of_20":{"type":"number","title":"Score Out Of 20"},"correct_count":{"type":"integer","title":"Correct Count"},"total_questions":{"type":"integer","title":"Total Questions"},"status":{"type":"string","title":"Status"},"completed_at":{"type":"string","format":"date-time","title":"Completed At"},"answers_with_corrections":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Answers With Corrections"},"points_earned":{"type":"number","title":"Points Earned","default":0.0},"points_max":{"type":"number","title":"Points Max","default":0.0},"pending_open_count":{"type":"integer","title":"Pending Open Count","default":0}},"type":"object","required":["id","score_out_of_20","correct_count","total_questions","status","completed_at"],"title":"CompleteAttemptResponse","description":"Response after completing a quiz attempt."},"ConfirmStudentListRequest":{"properties":{"students":{"items":{"$ref":"#/components/schemas/ConfirmStudentRequest"},"type":"array","title":"Students"}},"type":"object","required":["students"],"title":"ConfirmStudentListRequest"},"ConfirmStudentListResponse":{"properties":{"pending_students_created":{"type":"integer","title":"Pending Students Created"},"pending_students_updated":{"type":"integer","title":"Pending Students Updated"},"emails_sent":{"type":"integer","title":"Emails Sent"},"skipped":{"type":"integer","title":"Skipped"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"}},"type":"object","required":["pending_students_created","pending_students_updated","emails_sent","skipped","errors"],"title":"ConfirmStudentListResponse"},"ConfirmStudentRequest":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"status":{"type":"string","title":"Status"}},"type":"object","required":["first_name","last_name","status"],"title":"ConfirmStudentRequest"},"ConfirmVerificationData":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"ConfirmVerificationData"},"ConsoleEntry":{"properties":{"level":{"type":"string","enum":["log","info","warn","error","debug"],"title":"Level"},"message":{"type":"string","title":"Message"},"at":{"type":"string","format":"date-time","title":"At"}},"type":"object","required":["level","message","at"],"title":"ConsoleEntry"},"ContentType":{"type":"string","enum":["course","exercise","correction","exercise_correction","all"],"title":"ContentType"},"ContentsResponse":{"properties":{"status":{"type":"string","title":"Status"},"access":{"additionalProperties":true,"type":"object","title":"Access"},"folders":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Folders"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"}},"type":"object","required":["status","access","folders","items"],"title":"ContentsResponse"},"ConversationLogInput":{"properties":{"user_id":{"type":"string","title":"User Id"},"conversation":{"type":"string","title":"Conversation"}},"type":"object","required":["user_id","conversation"],"title":"ConversationLogInput"},"ConvertRequest":{"properties":{"html":{"type":"string","title":"Html"}},"type":"object","required":["html"],"title":"ConvertRequest"},"ConvertResponse":{"properties":{"markdown":{"type":"string","title":"Markdown"},"latex":{"type":"string","title":"Latex"},"status":{"type":"string","enum":["success","fallback","empty"],"title":"Status"}},"type":"object","required":["markdown","latex","status"],"title":"ConvertResponse"},"ConvertTranscriptToExercisesRequest":{"properties":{"transcript":{"type":"string","title":"Transcript"},"skip_tex":{"type":"boolean","title":"Skip Tex","default":false}},"type":"object","required":["transcript"],"title":"ConvertTranscriptToExercisesRequest"},"ConvertTranscriptToExercisesResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"exercises":{"items":{"$ref":"#/components/schemas/TeacherExerciseResponse"},"type":"array","title":"Exercises"}},"type":"object","required":["status","message","exercises"],"title":"ConvertTranscriptToExercisesResponse"},"CopyFromExamRequest":{"properties":{"exam_id":{"type":"string","title":"Exam Id"},"exercise_id":{"type":"integer","title":"Exercise Id"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"custom_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Title"}},"type":"object","required":["exam_id","exercise_id"],"title":"CopyFromExamRequest"},"CopyFromSourceRequest":{"properties":{"source_id":{"type":"string","title":"Source Id"},"source_type":{"type":"string","enum":["public","teacher","annales"],"title":"Source Type"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"custom_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Title"}},"type":"object","required":["source_id","source_type"],"title":"CopyFromSourceRequest"},"CopySharedAssignmentRequest":{"properties":{"class_id":{"type":"string","title":"Class Id"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"}},"type":"object","required":["class_id"],"title":"CopySharedAssignmentRequest"},"CorrectionContext":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"assignment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id"},"source":{"type":"string","enum":["self_practice","teacher_assignment","homework_helper"],"title":"Source"},"submission_attempt_index":{"type":"integer","title":"Submission Attempt Index"},"correctness":{"type":"string","title":"Correctness"},"feedback":{"anyOf":[{"type":"string","maxLength":32000},{"type":"null"}],"title":"Feedback"},"solution_blocks":{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":200,"title":"Solution Blocks"}},"type":"object","required":["session_id","exercise_id","source","submission_attempt_index","correctness"],"title":"CorrectionContext"},"CorrectionMetricsSummary":{"properties":{"high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High Rating Rate"},"ratings_count":{"type":"integer","title":"Ratings Count"},"category_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Category Breakdown"},"ratings_with_category":{"type":"integer","title":"Ratings With Category","default":0}},"type":"object","required":["high_rating_rate","ratings_count"],"title":"CorrectionMetricsSummary"},"CorrectionModificationDetail":{"properties":{"id":{"type":"string","title":"Id"},"teacher_id":{"type":"string","title":"Teacher Id"},"teacher_email":{"type":"string","title":"Teacher Email"},"teacher_exam_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Exam Id"},"teacher_exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Exercise Id"},"exam_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exam Title"},"exercise_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Title"},"exercise_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exercise Id"},"modification_method":{"type":"string","title":"Modification Method"},"previous_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Solution"},"new_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Solution"},"custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Instructions"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","teacher_id","teacher_email","modification_method","created_at"],"title":"CorrectionModificationDetail"},"CorrectionModificationListItem":{"properties":{"id":{"type":"string","title":"Id"},"teacher_id":{"type":"string","title":"Teacher Id"},"teacher_email":{"type":"string","title":"Teacher Email"},"teacher_exam_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Exam Id"},"teacher_exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Exercise Id"},"exam_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exam Title"},"exercise_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Title"},"exercise_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exercise Id"},"modification_method":{"type":"string","title":"Modification Method"},"has_previous":{"type":"boolean","title":"Has Previous"},"has_new":{"type":"boolean","title":"Has New"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","teacher_id","teacher_email","modification_method","has_previous","has_new","created_at"],"title":"CorrectionModificationListItem"},"CorrectionModificationSummary":{"properties":{"total_modifications":{"type":"integer","title":"Total Modifications"},"by_method":{"items":{"$ref":"#/components/schemas/MethodBreakdown"},"type":"array","title":"By Method"},"by_teacher":{"items":{"$ref":"#/components/schemas/TeacherBreakdown"},"type":"array","title":"By Teacher"}},"type":"object","required":["total_modifications","by_method","by_teacher"],"title":"CorrectionModificationSummary"},"CorrectionRequirementCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"prompt_text":{"type":"string","maxLength":2000,"minLength":1,"title":"Prompt Text"},"active_grades":{"items":{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},"type":"array","title":"Active Grades"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name","prompt_text"],"title":"CorrectionRequirementCreate"},"CorrectionRequirementResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"prompt_text":{"type":"string","title":"Prompt Text"},"active_grades":{"items":{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},"type":"array","title":"Active Grades"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","prompt_text","is_active","created_at","updated_at"],"title":"CorrectionRequirementResponse"},"CorrectionRequirementUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"prompt_text":{"anyOf":[{"type":"string","maxLength":2000,"minLength":1},{"type":"null"}],"title":"Prompt Text"},"active_grades":{"anyOf":[{"items":{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},"type":"array"},{"type":"null"}],"title":"Active Grades"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"CorrectionRequirementUpdate"},"CorrectionReviewItem":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"device_type":{"type":"string","title":"Device Type"},"rating":{"type":"integer","title":"Rating"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Id"},"assignment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"submission_attempt_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Submission Attempt Index"},"correctness":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correctness"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback"},"solution_blocks":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Solution Blocks"}},"type":"object","required":["id","created_at","device_type","rating"],"title":"CorrectionReviewItem"},"CountItem":{"properties":{"label":{"type":"string","title":"Label"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["label","count"],"title":"CountItem"},"CountryInput":{"properties":{"full_name":{"type":"string","maxLength":30,"minLength":3,"title":"Full Name"},"country":{"type":"string","maxLength":2,"minLength":2,"title":"Country"},"is_cpge_user":{"type":"boolean","title":"Is Cpge User","default":false}},"type":"object","required":["full_name","country"],"title":"CountryInput"},"Course":{"properties":{"_id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"is_teacher_course":{"type":"boolean","title":"Is Teacher Course","default":false},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"title":{"type":"string","title":"Title"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"status":{"type":"string","enum":["UPLOADING","PROCESSING_IMAGES","STRUCTURING","GENERATING_CONTENT","COMPLETED","FAILED"],"title":"Status","default":"UPLOADING"},"original_image_paths":{"items":{"type":"string"},"type":"array","title":"Original Image Paths"},"raw_content_blob":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Content Blob"},"units":{"anyOf":[{"items":{"$ref":"#/components/schemas/CourseUnit"},"type":"array"},{"type":"null"}],"title":"Units"},"generated_course_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated Course Content"},"revision_deck_status":{"anyOf":[{"type":"string","enum":["GENERATING","COMPLETED","FAILED"]},{"type":"null"}],"title":"Revision Deck Status"},"knowledge_quiz_status":{"anyOf":[{"type":"string","enum":["GENERATING","COMPLETED","FAILED"]},{"type":"null"}],"title":"Knowledge Quiz Status"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"warnings":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Warnings"},"figures_crop":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Figures Crop"},"processing_options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Processing Options"},"source_type":{"anyOf":[{"type":"string","enum":["student_upload","teacher_assigned","holiday_workbook"]},{"type":"null"}],"title":"Source Type"},"holiday_course_context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Holiday Course Context"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["user_id","title"],"title":"Course","description":"Represents a user course created through image uploads."},"CourseAssignmentDetails":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"teacher_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Id"},"course_id":{"type":"string","title":"Course Id"},"class_ids":{"items":{"type":"string"},"type":"array","title":"Class Ids"},"class_schedules":{"items":{"$ref":"#/components/schemas/CourseClassScheduleOut"},"type":"array","title":"Class Schedules"},"frozen_school_years":{"items":{"type":"string"},"type":"array","title":"Frozen School Years"},"assigned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Assigned At"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"is_visible_to_students":{"type":"boolean","title":"Is Visible To Students","default":true},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"sharing_options":{"$ref":"#/components/schemas/CourseComponentSharingOptions"},"knowledge_quiz_settings":{"$ref":"#/components/schemas/KnowledgeQuizSettings"}},"type":"object","required":["course_id"],"title":"CourseAssignmentDetails","description":"Response model for the (single, multi-class) course assignment.\n\nReturns `id=None` and empty `class_ids` when no assignment doc exists yet\nso the frontend can render the management UI without a 404.\n\n`class_schedules` is the truth for dates (one per class, decision D11);\n`start_date` and `knowledge_quiz_settings.start/end` are a legacy mirror."},"CourseAssignmentProgressSummary":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"course_title":{"type":"string","title":"Course Title"},"class_name":{"type":"string","title":"Class Name"},"total_students_assigned":{"type":"integer","title":"Total Students Assigned"},"students_started":{"type":"integer","title":"Students Started"},"students_completed":{"type":"integer","title":"Students Completed"},"average_percentage_completed":{"type":"number","title":"Average Percentage Completed"},"average_time_spent_seconds":{"type":"integer","title":"Average Time Spent Seconds"},"most_difficult_units":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Most Difficult Units"},"most_difficult_flashcards":{"items":{"type":"string"},"type":"array","title":"Most Difficult Flashcards"}},"type":"object","required":["assignment_id","course_title","class_name","total_students_assigned","students_started","students_completed","average_percentage_completed","average_time_spent_seconds","most_difficult_units","most_difficult_flashcards"],"title":"CourseAssignmentProgressSummary","description":"Summary statistics for a course assignment."},"CourseChatActionRequest":{"properties":{"operations":{"items":{"$ref":"#/components/schemas/CourseChatOperationPayload"},"type":"array","title":"Operations"}},"type":"object","title":"CourseChatActionRequest"},"CourseChatActionResponse":{"properties":{"status":{"type":"string","title":"Status"},"applied":{"type":"integer","title":"Applied"},"skipped":{"items":{"type":"string"},"type":"array","title":"Skipped"},"figure_ids":{"items":{"type":"string"},"type":"array","title":"Figure Ids"},"touched_unit_ids":{"items":{"type":"string"},"type":"array","title":"Touched Unit Ids"},"flashcards_touched":{"type":"boolean","title":"Flashcards Touched","default":false},"qcm_touched":{"type":"boolean","title":"Qcm Touched","default":false},"quiz_touched":{"type":"boolean","title":"Quiz Touched","default":false},"course":{"$ref":"#/components/schemas/Course"}},"type":"object","required":["status","applied","skipped","figure_ids","touched_unit_ids","course"],"title":"CourseChatActionResponse"},"CourseChatOperationPayload":{"properties":{"type":{"type":"string","enum":["edit_block","insert_block","delete_block","edit_unit_title","add_unit","delete_unit","add_flashcard","edit_flashcard","delete_flashcard","add_quiz_question","edit_quiz_question","delete_quiz_question","add_qcm","edit_qcm","delete_qcm"],"title":"Type"},"unit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Id"},"block_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Block Index"},"block_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Block Type"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"figure":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"after_unit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After Unit Id"},"unit_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Type"},"flashcard_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flashcard Id"},"qcm_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qcm Id"},"front":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Front"},"back":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Back"},"question_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Id"},"question_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Type"},"variation_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Variation Index"},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options"},"correct_option":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Correct Option"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation"},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer"},"criteria":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Criteria"}},"type":"object","required":["type"],"title":"CourseChatOperationPayload","description":"One granular operation proposed by the chat (<course_action_attachment>)."},"CourseClassScheduleOut":{"properties":{"class_id":{"type":"string","title":"Class Id"},"class_name":{"type":"string","title":"Class Name","default":""},"school_year":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Year"},"is_past":{"type":"boolean","title":"Is Past","default":false},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"quiz_start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Quiz Start Date"},"quiz_end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Quiz End Date"}},"type":"object","required":["class_id"],"title":"CourseClassScheduleOut","description":"One class's planning for the course, with the class named and placed\nin its school year so the cartouche can lock past classes."},"CourseComponentSharingOptions":{"properties":{"include_content_units":{"type":"boolean","title":"Include Content Units","default":true},"include_qcm_units":{"type":"boolean","title":"Include Qcm Units","default":true},"include_flashcard_units":{"type":"boolean","title":"Include Flashcard Units","default":true},"include_global_flashcards":{"type":"boolean","title":"Include Global Flashcards","default":true},"include_knowledge_quiz":{"type":"boolean","title":"Include Knowledge Quiz","default":true},"excluded_unit_ids":{"items":{"type":"string"},"type":"array","title":"Excluded Unit Ids"}},"type":"object","title":"CourseComponentSharingOptions","description":"Model for selective sharing options of course components.\nDefines what parts of a course are shared with students."},"CourseContentCreate":{"properties":{"content":{"type":"string","title":"Content"},"content_type":{"type":"string","title":"Content Type","default":"latex"},"latex_content":{"type":"string","title":"Latex Content","default":""}},"type":"object","required":["content"],"title":"CourseContentCreate"},"CourseContentInsert":{"properties":{"content":{"type":"string","title":"Content"},"content_type":{"type":"string","title":"Content Type"},"index":{"type":"integer","title":"Index"}},"type":"object","required":["content","content_type","index"],"title":"CourseContentInsert"},"CourseCreateRequest":{"properties":{"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"graph_data":{"additionalProperties":true,"type":"object","title":"Graph Data","default":{}}},"type":"object","required":["title"],"title":"CourseCreateRequest"},"CoursePerformance":{"properties":{"course_name":{"type":"string","title":"Course Name"},"topics":{"items":{"$ref":"#/components/schemas/TopicPerformance"},"type":"array","title":"Topics"}},"type":"object","required":["course_name","topics"],"title":"CoursePerformance"},"CourseResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["id","title"],"title":"CourseResponse"},"CourseStatusResponse":{"properties":{"status":{"type":"string","title":"Status"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["status"],"title":"CourseStatusResponse"},"CourseStructureResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"course":{"$ref":"#/components/schemas/Course"}},"type":"object","required":["status","message","course"],"title":"CourseStructureResponse","description":"Response model for course structure operations."},"CourseSummary":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"has_quiz":{"type":"boolean","title":"Has Quiz","default":false},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"}},"type":"object","required":["id","title","status","created_at"],"title":"CourseSummary"},"CourseSummaryList":{"properties":{"courses":{"items":{"$ref":"#/components/schemas/CourseSummary"},"type":"array","title":"Courses"}},"type":"object","required":["courses"],"title":"CourseSummaryList"},"CourseSummaryListWithFolders":{"properties":{"courses":{"items":{"$ref":"#/components/schemas/CourseSummaryWithFolder"},"type":"array","title":"Courses"}},"type":"object","required":["courses"],"title":"CourseSummaryListWithFolders","description":"List of courses with folder support."},"CourseSummaryWithFolder":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"class_count":{"type":"integer","title":"Class Count","default":0},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"quiz_end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Quiz End Date"},"classes":{"items":{"$ref":"#/components/schemas/CourseClassScheduleOut"},"type":"array","title":"Classes"}},"type":"object","required":["id","title","status","created_at"],"title":"CourseSummaryWithFolder","description":"Course summary with folder information."},"CourseTopicResponse":{"properties":{"course_name":{"type":"string","title":"Course Name"},"topic_name":{"type":"string","title":"Topic Name"},"levels":{"items":{"$ref":"#/components/schemas/Level"},"type":"array","title":"Levels"}},"type":"object","required":["course_name","topic_name","levels"],"title":"CourseTopicResponse"},"CourseUnit":{"properties":{"unit_id":{"type":"string","title":"Unit Id"},"type":{"$ref":"#/components/schemas/UnitType"},"title":{"type":"string","title":"Title"},"unit_summary":{"type":"string","title":"Unit Summary"},"suggested_content_type":{"anyOf":[{"$ref":"#/components/schemas/UnitType"},{"type":"null"}]},"brief_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brief Description"},"generated_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated Content"}},"type":"object","required":["type","title","unit_summary"],"title":"CourseUnit","description":"Represents a structured unit within a course.\nEach unit is identified by a unique ID and contains a title and detailed information."},"CourseWithTopics":{"properties":{"course_name":{"type":"string","title":"Course Name"},"topics":{"items":{"$ref":"#/components/schemas/Topic"},"type":"array","title":"Topics"}},"type":"object","required":["course_name","topics"],"title":"CourseWithTopics"},"CpgeMetadata-Input":{"properties":{"hints":{"items":{"type":"string"},"type":"array","title":"Hints"},"banque":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banque"}},"type":"object","title":"CpgeMetadata","description":"CPGE-specific fields, present only when `library == \"cpge\"`.\n\nGrouped into a subdoc so that readers of a regular public exercise\ndon't have to reason about hints / banque at all — those are\ngenuinely prepa-only concerns."},"CreateB2BSchoolAction":{"properties":{"action":{"type":"string","const":"create_b2b_school","title":"Action"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Domain"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"}},"type":"object","required":["action"],"title":"CreateB2BSchoolAction"},"CreateClassBody":{"properties":{"name":{"type":"string","title":"Name"},"school_year":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Year"},"grade":{"anyOf":[{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},{"type":"null"}],"title":"Grade"}},"type":"object","required":["name"],"title":"CreateClassBody"},"CreateCourseFromTexRequest":{"properties":{"tex_content":{"type":"string","title":"Tex Content"},"include_qcm_unit":{"type":"boolean","title":"Include Qcm Unit","default":true},"include_flashcards_unit":{"type":"boolean","title":"Include Flashcards Unit","default":true}},"type":"object","required":["tex_content"],"title":"CreateCourseFromTexRequest","description":"Request model for creating course content from raw LaTeX"},"CreateCourseFromTexResponse":{"properties":{"course_id":{"type":"string","title":"Course Id"},"status":{"type":"string","title":"Status"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["course_id","status"],"title":"CreateCourseFromTexResponse","description":"Response model for course creation from LaTeX"},"CreateDatasetRequest":{"properties":{"name":{"type":"string","minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"CreateDatasetRequest"},"CreateExerciseRequest":{"properties":{"latex_content":{"type":"string","title":"Latex Content"}},"type":"object","required":["latex_content"],"title":"CreateExerciseRequest"},"CreateExercisesFromUploadRequest":{"properties":{"images":{"items":{"type":"string"},"type":"array","title":"Images"},"save_to_library":{"type":"boolean","title":"Save To Library","default":false}},"type":"object","required":["images"],"title":"CreateExercisesFromUploadRequest"},"CreateExercisesFromUploadResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"exercises":{"items":{"$ref":"#/components/schemas/TeacherExerciseResponse"},"type":"array","title":"Exercises"},"transcriptions":{"items":{"type":"string"},"type":"array","title":"Transcriptions"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"diagram_image_urls":{"items":{"type":"string"},"type":"array","title":"Diagram Image Urls"}},"type":"object","required":["status","message","exercises","transcriptions","image_urls","diagram_image_urls"],"title":"CreateExercisesFromUploadResponse"},"CreateFigureRequest":{"properties":{"image_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Image Urls"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"exercise_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Content"},"current_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Code"},"current_diagram_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Diagram Url"},"source_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"}},"type":"object","title":"CreateFigureRequest"},"CreateFigureResponse":{"properties":{"figure_id":{"type":"string","title":"Figure Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["figure_id","status"],"title":"CreateFigureResponse"},"CreateFlashcardRequest":{"properties":{"front":{"type":"string","title":"Front"},"back":{"type":"string","title":"Back"},"revision_type":{"anyOf":[{"type":"string","enum":["unit","course_global"]},{"type":"null"}],"title":"Revision Type","default":"course_global"}},"type":"object","required":["front","back"],"title":"CreateFlashcardRequest","description":"Request model for creating a new flashcard."},"CreateFrenchSchoolAction":{"properties":{"action":{"type":"string","const":"create_french_school","title":"Action"},"name":{"type":"string","minLength":2,"title":"Name"},"city":{"type":"string","minLength":1,"title":"City"},"uai":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uai"},"kind":{"type":"string","enum":["france","abroad"],"title":"Kind","default":"france"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"create_b2b_school":{"type":"boolean","title":"Create B2B School","default":true},"email_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Domain"}},"type":"object","required":["action","name","city"],"title":"CreateFrenchSchoolAction"},"CreateReportPayload":{"properties":{"copy_id":{"type":"string","title":"Copy Id"},"category":{"type":"string","enum":["Erreur de lecture de copie","Erreur de maths","Appréciation trop stricte","Autre"],"title":"Category"},"note":{"type":"string","maxLength":2000,"title":"Note","default":""},"exercise_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exercise Id"},"criterion_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Criterion Id"},"reported_comment_text":{"type":"string","title":"Reported Comment Text","default":""}},"type":"object","required":["copy_id","category"],"title":"CreateReportPayload"},"CreateSessionBody":{"properties":{"exam_id":{"type":"string","title":"Exam Id"}},"type":"object","required":["exam_id"],"title":"CreateSessionBody"},"CreateShareResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"share_token":{"type":"string","title":"Share Token"},"share_url":{"type":"string","title":"Share Url"}},"type":"object","required":["status","message","share_token","share_url"],"title":"CreateShareResponse"},"CreateStudentExamRequest":{"properties":{"exam_title":{"type":"string","title":"Exam Title"},"time_limit":{"type":"string","title":"Time Limit"}},"type":"object","required":["exam_title","time_limit"],"title":"CreateStudentExamRequest"},"CreateStudentExamResponse":{"properties":{"status":{"type":"string","title":"Status"},"exam_id":{"type":"string","title":"Exam Id"}},"type":"object","required":["status","exam_id"],"title":"CreateStudentExamResponse"},"CreateTeacherExamRequest":{"properties":{"examSubjectTitle":{"type":"string","title":"Examsubjecttitle"},"customGradingInstructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customgradinginstructions"},"grade":{"anyOf":[{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},{"type":"null"}],"title":"Grade"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"type":"object","required":["examSubjectTitle"],"title":"CreateTeacherExamRequest"},"CreateTeacherExamResponse":{"properties":{"status":{"type":"string","title":"Status"},"exam":{"additionalProperties":true,"type":"object","title":"Exam"}},"type":"object","required":["status","exam"],"title":"CreateTeacherExamResponse"},"CreateTextExerciseRequest":{"properties":{"latex_content":{"type":"string","title":"Latex Content"},"subject":{"anyOf":[{"type":"string","enum":["maths","physique-chimie"]},{"type":"null"}],"title":"Subject"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id","description":"Optional ID of a Figure document to associate with this exercise."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Optional title override for the homework helper exercise."},"source_chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Chat Id","description":"Optional chat ID used for CTA idempotency so repeated clicks reopen the same homework helper session."}},"type":"object","required":["latex_content"],"title":"CreateTextExerciseRequest"},"CreateTranscriptionTestsRequest":{"properties":{"dataset":{"type":"string","minLength":1,"title":"Dataset"},"image_urls":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Image Urls"},"exercise_contents":{"anyOf":[{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array"},{"type":"null"}],"title":"Exercise Contents"},"exercise_solutions":{"anyOf":[{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array"},{"type":"null"}],"title":"Exercise Solutions"},"user_ids":{"anyOf":[{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array"},{"type":"null"}],"title":"User Ids"},"exercise_ids":{"anyOf":[{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array"},{"type":"null"}],"title":"Exercise Ids"}},"type":"object","required":["dataset","image_urls"],"title":"CreateTranscriptionTestsRequest"},"CriterionOutcome":{"properties":{"criterion_index":{"type":"integer","title":"Criterion Index"},"outcome":{"type":"string","enum":["correct","partial","wrong","unanswered"],"title":"Outcome"},"note":{"type":"string","title":"Note"},"evidence":{"items":{"$ref":"#/components/schemas/EvidenceSpan"},"type":"array","title":"Evidence"}},"type":"object","required":["criterion_index","outcome","note","evidence"],"title":"CriterionOutcome","description":"`criterion_index` references `Rubric.questions[i].criteria[idx]`. Each\ncorrect criterion contributes 1.0 to the grade, partial 0.5, wrong 0.0."},"CsatMetricsSummary":{"properties":{"high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High Rating Rate"},"ratings_count":{"type":"integer","title":"Ratings Count"},"category_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Category Breakdown"},"ratings_with_category":{"type":"integer","title":"Ratings With Category","default":0}},"type":"object","required":["high_rating_rate","ratings_count"],"title":"CsatMetricsSummary"},"CsatSummary":{"properties":{"high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High Rating Rate"},"ratings_count":{"type":"integer","title":"Ratings Count"},"category_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Category Breakdown"},"ratings_with_category":{"type":"integer","title":"Ratings With Category","default":0}},"type":"object","required":["high_rating_rate","ratings_count"],"title":"CsatSummary"},"CustomCourseCreate":{"properties":{"title":{"type":"string","title":"Title"}},"type":"object","required":["title"],"title":"CustomCourseCreate"},"CustomSchoolTeacherResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_approved":{"type":"boolean","title":"Is Approved"},"custom_school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom School Name"},"custom_school_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom School City"},"custom_school_validated":{"type":"boolean","title":"Custom School Validated"},"establishment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Establishment"}},"type":"object","required":["id","email","full_name","created_at","is_approved","custom_school_name","custom_school_city","custom_school_validated","establishment"],"title":"CustomSchoolTeacherResponse","description":"Response model for teachers with custom school entries."},"CustomSchoolTeachersListResponse":{"properties":{"teachers":{"items":{"$ref":"#/components/schemas/CustomSchoolTeacherResponse"},"type":"array","title":"Teachers"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["teachers","total"],"title":"CustomSchoolTeachersListResponse","description":"Response model for custom school teachers list."},"DailyPoint":{"properties":{"day":{"type":"string","title":"Day"},"attempts":{"type":"integer","title":"Attempts"},"envois":{"type":"integer","title":"Envois"},"graded":{"type":"integer","title":"Graded"},"errors":{"type":"integer","title":"Errors"},"rejected":{"type":"integer","title":"Rejected"},"unique_students":{"type":"integer","title":"Unique Students"},"avg_latency_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Latency Seconds"}},"type":"object","required":["day","attempts","envois","graded","errors","rejected","unique_students"],"title":"DailyPoint"},"DailyProgress":{"properties":{"date":{"type":"string","title":"Date"},"completed_sub_chapitres":{"type":"integer","title":"Completed Sub Chapitres"},"exercises_attempted":{"type":"integer","title":"Exercises Attempted"}},"type":"object","required":["date","completed_sub_chapitres","exercises_attempted"],"title":"DailyProgress","description":"Daily progress tracking for the dashboard."},"DashboardResponse":{"properties":{"global_stats":{"$ref":"#/components/schemas/GlobalStats"},"chapitres_overview":{"items":{"$ref":"#/components/schemas/ChapitreStats"},"type":"array","title":"Chapitres Overview"}},"type":"object","required":["global_stats","chapitres_overview"],"title":"DashboardResponse","description":"Complete dashboard response with global and chapter-level statistics."},"DeleteAccountResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"merged_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Merged Count"},"merge_details":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Merge Details"}},"type":"object","required":["success","message"],"title":"DeleteAccountResponse"},"DeleteCategoryInput":{"properties":{"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path","description":"Category path to delete"}},"type":"object","required":["category_path"],"title":"DeleteCategoryInput","description":"Input model for deleting a category"},"DeleteDatasetRequest":{"properties":{"name":{"type":"string","minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"DeleteDatasetRequest"},"DeletePhotoBody":{"properties":{"image_url":{"type":"string","title":"Image Url"}},"type":"object","required":["image_url"],"title":"DeletePhotoBody"},"DeleteResponse":{"properties":{"message":{"type":"string","title":"Message"},"success":{"type":"boolean","title":"Success"}},"type":"object","required":["message","success"],"title":"DeleteResponse","description":"Response model for delete operations"},"DeleteUnitRequest":{"properties":{"preserve_content":{"type":"boolean","title":"Preserve Content","description":"Whether to preserve flashcards/QCMs as global content","default":false}},"type":"object","title":"DeleteUnitRequest","description":"Request model for unit deletion with optional content preservation."},"DemoEmailRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"DemoEmailRequest"},"DemoStatusOut":{"properties":{"demo_users":{"items":{"$ref":"#/components/schemas/DemoUserOut"},"type":"array","title":"Demo Users"},"class_ids":{"items":{"type":"string"},"type":"array","title":"Class Ids"},"live_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Live Counts"},"snapshot":{"anyOf":[{"$ref":"#/components/schemas/SnapshotOut"},{"type":"null"}]}},"type":"object","required":["demo_users","class_ids","live_counts"],"title":"DemoStatusOut"},"DemoUserOut":{"properties":{"id":{"type":"string","title":"Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},"type":"object","required":["id"],"title":"DemoUserOut"},"DetailedStudentProgress":{"properties":{"student":{"$ref":"#/components/schemas/StudentDetails"},"progress":{"$ref":"#/components/schemas/StudentCourseProgress"}},"type":"object","required":["student","progress"],"title":"DetailedStudentProgress","description":"Detailed progress information for a specific student."},"DetectDiagramRequest":{"properties":{"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"}},"type":"object","required":["image_urls"],"title":"DetectDiagramRequest"},"DetectDiagramResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"diagram_image_urls":{"items":{"type":"string"},"type":"array","title":"Diagram Image Urls"}},"type":"object","required":["status","message","diagram_image_urls"],"title":"DetectDiagramResponse"},"DetectHandwritingRequest":{"properties":{"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"}},"type":"object","required":["image_urls"],"title":"DetectHandwritingRequest"},"DetectHandwritingResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"handwriting_results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Handwriting Results"}},"type":"object","required":["status","message","handwriting_results"],"title":"DetectHandwritingResponse"},"DeviceTokenRequest":{"properties":{"token":{"type":"string","title":"Token"},"platform":{"type":"string","title":"Platform"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},"type":"object","required":["token","platform"],"title":"DeviceTokenRequest","description":"Request model for registering a device token"},"DiagnosticInfoOut":{"properties":{"explanation":{"type":"string","title":"Explanation"}},"type":"object","required":["explanation"],"title":"DiagnosticInfoOut"},"DiagnosticResultOut":{"properties":{"id":{"type":"string","title":"Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"admin_user_id":{"type":"string","title":"Admin User Id"},"chapter_tag_id":{"type":"string","title":"Chapter Tag Id"},"is_relevant":{"type":"boolean","title":"Is Relevant"},"explanation":{"type":"string","title":"Explanation"},"sequence_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sequence Number"},"ran_at":{"type":"string","format":"date-time","title":"Ran At"}},"type":"object","required":["id","exercise_id","admin_user_id","chapter_tag_id","is_relevant","explanation","ran_at"],"title":"DiagnosticResultOut"},"DiagramPreviewItem":{"properties":{"original_url":{"type":"string","title":"Original Url"},"diagram_image_url":{"type":"string","title":"Diagram Image Url"},"diagram_code":{"type":"string","title":"Diagram Code"}},"type":"object","required":["original_url","diagram_image_url","diagram_code"],"title":"DiagramPreviewItem"},"DifficultyAnalysisResponse":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"difficulty_points":{"items":{"type":"string"},"type":"array","title":"Difficulty Points"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"}},"type":"object","required":["exercise_id","difficulty_points","generated_at"],"title":"DifficultyAnalysisResponse"},"DuplicateAssignmentRequest":{"properties":{"class_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"}},"type":"object","title":"DuplicateAssignmentRequest"},"DuplicateCourseResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"}},"type":"object","required":["id","title"],"title":"DuplicateCourseResponse"},"EditAiRequest":{"properties":{"prompt":{"type":"string","title":"Prompt"}},"type":"object","required":["prompt"],"title":"EditAiRequest"},"EditLatexRequest":{"properties":{"latex_content":{"type":"string","title":"Latex Content"}},"type":"object","required":["latex_content"],"title":"EditLatexRequest"},"EditTextRequest":{"properties":{"text":{"type":"string","title":"Text"},"transcription_suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcription Suggestion"},"keep_existing_transcription_suggestion":{"type":"boolean","title":"Keep Existing Transcription Suggestion","default":false}},"type":"object","required":["text"],"title":"EditTextRequest"},"EmailBetaUpdateRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"EmailBetaUpdateRequest"},"EmailRecoveryCodeResponse":{"properties":{"recovery_code":{"type":"string","title":"Recovery Code"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["recovery_code","expires_at"],"title":"EmailRecoveryCodeResponse"},"ErrorInsightResponse":{"properties":{"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"advice":{"type":"string","title":"Advice"},"occurrences":{"type":"integer","title":"Occurrences"}},"type":"object","required":["title","description","advice","occurrences"],"title":"ErrorInsightResponse","description":"`occurrences` is the \"you did this N times\" count shown to the student.\nThe `impact`/`effort` factors behind the ranking stay server-side."},"ErrorResponse":{"properties":{"detail":{"type":"string","title":"Detail"}},"type":"object","required":["detail"],"title":"ErrorResponse"},"EstablishmentStats":{"properties":{"paid":{"type":"integer","title":"Paid"},"registered":{"type":"integer","title":"Registered"},"paid_percentage":{"type":"number","title":"Paid Percentage"}},"type":"object","required":["paid","registered","paid_percentage"],"title":"EstablishmentStats"},"EvaluationOverrideRequest":{"properties":{"questions":{"items":{"$ref":"#/components/schemas/_OverrideQuestion"},"type":"array","maxItems":50,"title":"Questions"},"feedback":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Feedback"}},"type":"object","required":["questions","feedback"],"title":"EvaluationOverrideRequest"},"EvaluationRow":{"properties":{"student_id":{"type":"string","title":"Student Id"},"student_display_name":{"type":"string","title":"Student Display Name"},"exercise_id":{"type":"string","title":"Exercise Id"},"latest_evaluation":{"anyOf":[{"$ref":"#/components/schemas/RubricEvaluationResponse"},{"type":"null"}]},"submission_attempt_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Submission Attempt Index"}},"type":"object","required":["student_id","student_display_name","exercise_id","latest_evaluation","submission_attempt_index"],"title":"EvaluationRow","description":"One (student × exercise) cell in the class endpoint's `rows` table."},"EvidenceSpan":{"properties":{"excerpt":{"type":"string","title":"Excerpt"},"span":{"$ref":"#/components/schemas/TextSpan"}},"type":"object","required":["excerpt","span"],"title":"EvidenceSpan","description":"The submission excerpt is kept post-resolution as a tamper-resistant\nsnapshot of the cited text and as a frontend fallback if offsets drift."},"ExamChatActionRequest":{"properties":{"action":{"type":"string","enum":["add","edit","remove"],"title":"Action"},"exercise_ids":{"items":{"type":"integer"},"type":"array","title":"Exercise Ids"},"exercises":{"items":{"$ref":"#/components/schemas/ExamChatExercisePayload"},"type":"array","title":"Exercises"}},"type":"object","required":["action"],"title":"ExamChatActionRequest"},"ExamChatExercisePayload":{"properties":{"exercise_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exercise Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"statement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statement"},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution"},"points":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Points"},"figure":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure"},"solution_figure":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Figure"},"remove_figure":{"type":"boolean","title":"Remove Figure","default":false},"remove_solution_figure":{"type":"boolean","title":"Remove Solution Figure","default":false}},"type":"object","title":"ExamChatExercisePayload"},"ExamExercise":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution"},"points":{"type":"number","title":"Points","default":0.0},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"solution_figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Figure Id"},"figure_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Solution"}},"type":"object","required":["id","title","content"],"title":"ExamExercise","description":"Represents an exercise in a teacher exam.\nUsed for both draft and final versions of exercises."},"ExamPerformance":{"properties":{"average_correct":{"type":"number","title":"Average Correct"},"average_partial":{"type":"number","title":"Average Partial"},"average_wrong":{"type":"number","title":"Average Wrong"},"average_total_questions":{"type":"number","title":"Average Total Questions"}},"type":"object","required":["average_correct","average_partial","average_wrong","average_total_questions"],"title":"ExamPerformance"},"ExamVariantAccept":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"exercise_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Exercise Ids"}},"type":"object","title":"ExamVariantAccept"},"ExamVariantAcceptResponse":{"properties":{"exam_id":{"type":"string","title":"Exam Id"},"exam_title":{"type":"string","title":"Exam Title"}},"type":"object","required":["exam_id","exam_title"],"title":"ExamVariantAcceptResponse"},"ExamVariantCreate":{"properties":{"label":{"type":"string","maxLength":60,"title":"Label","default":"Sujet B"},"instructions":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Instructions"}},"type":"object","title":"ExamVariantCreate"},"ExamVariantJobResponse":{"properties":{"id":{"type":"string","title":"Id"},"source_exam_id":{"type":"string","title":"Source Exam Id"},"label":{"type":"string","title":"Label"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"status":{"type":"string","title":"Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"created_exam_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Exam Id"},"exercises":{"items":{"$ref":"#/components/schemas/VariantExerciseResponse"},"type":"array","title":"Exercises"},"done_count":{"type":"integer","title":"Done Count"},"total_count":{"type":"integer","title":"Total Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"}},"type":"object","required":["id","source_exam_id","label","instructions","status","error","created_exam_id","exercises","done_count","total_count","created_at","updated_at","finished_at"],"title":"ExamVariantJobResponse"},"ExamVersionResponse":{"properties":{"id":{"type":"string","title":"Id"},"exam_subject_title":{"type":"string","title":"Exam Subject Title"},"structured_exercises":{"items":{},"type":"array","title":"Structured Exercises"},"author_name":{"type":"string","title":"Author Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","exam_subject_title","structured_exercises","author_name","created_at"],"title":"ExamVersionResponse","description":"Response model for exam version with populated author name."},"ExamVersionsListResponse":{"properties":{"versions":{"items":{"$ref":"#/components/schemas/ExamVersionResponse"},"type":"array","title":"Versions"},"current_version_id":{"type":"string","title":"Current Version Id"}},"type":"object","required":["versions","current_version_id"],"title":"ExamVersionsListResponse","description":"Response model for list of exam versions."},"ExerciseCompletionStats":{"properties":{"source_type":{"type":"string","enum":["self_practice","teacher_assignment"],"title":"Source Type"},"student_count":{"type":"integer","title":"Student Count"},"mean_ratio":{"type":"number","title":"Mean Ratio"},"median_ratio":{"type":"number","title":"Median Ratio"},"std_ratio":{"type":"number","title":"Std Ratio"},"min_ratio":{"type":"number","title":"Min Ratio"},"max_ratio":{"type":"number","title":"Max Ratio"},"zero_ratio_count":{"type":"integer","title":"Zero Ratio Count"},"full_ratio_count":{"type":"integer","title":"Full Ratio Count"},"mean_finished":{"type":"number","title":"Mean Finished","default":0.0},"median_finished":{"type":"number","title":"Median Finished","default":0.0},"std_finished":{"type":"number","title":"Std Finished","default":0.0},"min_finished":{"type":"integer","title":"Min Finished","default":0},"max_finished":{"type":"integer","title":"Max Finished","default":0},"mean_total":{"type":"number","title":"Mean Total","default":0.0},"median_total":{"type":"number","title":"Median Total","default":0.0},"std_total":{"type":"number","title":"Std Total","default":0.0},"min_total":{"type":"integer","title":"Min Total","default":0},"max_total":{"type":"integer","title":"Max Total","default":0},"heatmap_data":{"items":{"$ref":"#/components/schemas/HeatmapDataPoint"},"type":"array","title":"Heatmap Data"},"histogram_data":{"items":{"$ref":"#/components/schemas/HistogramBucket"},"type":"array","title":"Histogram Data"}},"type":"object","required":["source_type","student_count","mean_ratio","median_ratio","std_ratio","min_ratio","max_ratio","zero_ratio_count","full_ratio_count","heatmap_data","histogram_data"],"title":"ExerciseCompletionStats","description":"Statistics for a source group (self_practice or teacher_assignment)."},"ExerciseCreate":{"properties":{"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"difficulty":{"type":"string","title":"Difficulty"},"topic":{"type":"string","title":"Topic"}},"type":"object","required":["title","description","difficulty","topic"],"title":"ExerciseCreate"},"ExerciseDetails":{"properties":{"id":{"type":"string","title":"Id"},"themes":{"items":{"type":"string"},"type":"array","title":"Themes","default":[]},"content":{"type":"string","title":"Content","default":""},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution","default":""},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"solution_figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Figure Id"},"figure_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Solution"},"figures":{"items":{"type":"string"},"type":"array","title":"Figures"},"figures_solution":{"items":{"type":"string"},"type":"array","title":"Figures Solution"}},"type":"object","required":["id"],"title":"ExerciseDetails"},"ExerciseFeedback":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"exercise_content":{"type":"string","title":"Exercise Content"},"exercise_solution":{"type":"string","title":"Exercise Solution","default":""},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"solution_figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Figure Id"},"figure_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Solution"},"student_results":{"items":{"$ref":"#/components/schemas/StudentResult"},"type":"array","title":"Student Results"},"difficulty_points":{"items":{"type":"string"},"type":"array","title":"Difficulty Points","default":[]},"chat_insights":{"items":{"type":"string"},"type":"array","title":"Chat Insights","default":[]},"correct_count":{"type":"integer","title":"Correct Count","default":0},"partial_count":{"type":"integer","title":"Partial Count","default":0},"wrong_count":{"type":"integer","title":"Wrong Count","default":0},"no_submission_count":{"type":"integer","title":"No Submission Count","default":0},"is_calcul":{"type":"boolean","title":"Is Calcul","default":false},"exercise_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Title"},"variations":{"items":{"$ref":"#/components/schemas/CalculVariation"},"type":"array","title":"Variations"}},"type":"object","required":["exercise_id","exercise_content","student_results"],"title":"ExerciseFeedback"},"ExerciseFlagWithDetails":{"properties":{"id":{"type":"string","title":"Id"},"user_email":{"type":"string","title":"User Email"},"user_id":{"type":"string","title":"User Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"exercise_content":{"type":"string","title":"Exercise Content"},"exercise_type":{"type":"string","title":"Exercise Type","default":"public"},"exercise_sequence_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exercise Sequence Number"},"report_type":{"type":"string","title":"Report Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"status":{"type":"string","title":"Status"},"reviewed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewed By"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"}},"type":"object","required":["id","user_email","user_id","exercise_id","exercise_content","report_type","created_at","status"],"title":"ExerciseFlagWithDetails"},"ExerciseLog":{"properties":{"id":{"type":"string","title":"Id"},"user_email":{"type":"string","title":"User Email"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"content":{"type":"string","title":"Content"},"latex_content":{"type":"string","title":"Latex Content"},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution"},"conversation_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conversation History"},"conversation_history_archive":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conversation History Archive"},"correctness":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correctness"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"}},"type":"object","required":["id","user_email","created_at","content","latex_content","conversation_history","conversation_history_archive","image_urls"],"title":"ExerciseLog"},"ExercisePhotoStatusResponse":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"grading_status":{"anyOf":[{"type":"string","enum":["processing","graded","error","rejected"]},{"type":"null"}],"title":"Grading Status"},"attempt_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Attempt Index"},"computed_grade":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Computed Grade"},"max_grade":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Grade"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"}},"type":"object","required":["exercise_id","grading_status","attempt_index","computed_grade","max_grade","rejection_reason"],"title":"ExercisePhotoStatusResponse"},"ExercisePreviewOut":{"properties":{"id":{"type":"string","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"type":"string","title":"Content"},"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"}},"type":"object","required":["id","content"],"title":"ExercisePreviewOut"},"ExerciseReportCreate":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"report_type":{"type":"string","enum":["bad_formatting","wrong_solution","unclear_explanation","other"],"title":"Report Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["exercise_id","report_type"],"title":"ExerciseReportCreate"},"ExerciseReportResponse":{"properties":{"id":{"type":"string","title":"Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"user_id":{"type":"string","title":"User Id"},"report_type":{"type":"string","enum":["bad_formatting","wrong_solution","unclear_explanation","other"],"title":"Report Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"status":{"type":"string","enum":["pending","resolved","rejected"],"title":"Status"},"exercise":{"additionalProperties":true,"type":"object","title":"Exercise"},"user":{"additionalProperties":true,"type":"object","title":"User"}},"type":"object","required":["id","exercise_id","user_id","report_type","created_at","status","exercise","user"],"title":"ExerciseReportResponse"},"ExerciseSessionCreate":{"properties":{"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"},"subject":{"anyOf":[{"type":"string","enum":["maths","physique-chimie"]},{"type":"null"}],"title":"Subject"},"is_sequential":{"type":"boolean","title":"Is Sequential"},"use_timer":{"type":"boolean","title":"Use Timer"},"device_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Type"},"assignment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id"},"is_trial_run":{"type":"boolean","title":"Is Trial Run","default":false}},"type":"object","required":["exercise_ids","is_sequential","use_timer"],"title":"ExerciseSessionCreate"},"ExerciseSolutionResponse":{"properties":{"status":{"type":"string","title":"Status"},"correctness":{"type":"string","title":"Correctness"},"feedback":{"type":"string","title":"Feedback"}},"type":"object","required":["status","correctness","feedback"],"title":"ExerciseSolutionResponse"},"ExerciseSummary":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"statement":{"type":"string","title":"Statement"},"rubric":{"anyOf":[{"$ref":"#/components/schemas/RubricResponse"},{"type":"null"}]}},"type":"object","required":["exercise_id","statement","rubric"],"title":"ExerciseSummary","description":"One row in the class endpoint's `exercises` list. Statement is\nbest-effort text from the exercise; rubric is `None` if the exercise\nhas no rubric yet."},"ExerciseTitleUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","title":"ExerciseTitleUpdate","description":"Patch the short human-readable title on an exercise.\n\n`None` or empty string clears the title (unsets the field). Length is\nintentionally unbounded here — the generation prompt keeps titles to\n3-8 words; admin manual edits don't have a hard cap."},"ExerciseTypeDetailItem":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"source_type":{"type":"string","title":"Source Type"},"assignment_count":{"type":"integer","title":"Assignment Count"}},"type":"object","required":["exercise_id","title","source_type","assignment_count"],"title":"ExerciseTypeDetailItem"},"ExerciseTypeUpdate":{"properties":{"type":{"type":"string","enum":["exercice","automatisme","application_du_cours"],"title":"Type"}},"type":"object","required":["type"],"title":"ExerciseTypeUpdate"},"ExerciseUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"}},"type":"object","title":"ExerciseUpdate"},"ExerciseVersionResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"type":"string","title":"Content"},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution"},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"solution_figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Figure Id"},"figure_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Solution"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"themes":{"items":{"type":"string"},"type":"array","title":"Themes"},"author_name":{"type":"string","title":"Author Name"},"edit_method":{"type":"string","title":"Edit Method"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","content","author_name","edit_method","created_at"],"title":"ExerciseVersionResponse","description":"Response model for exercise version with populated author name."},"ExerciseVersionsListResponse":{"properties":{"versions":{"items":{"$ref":"#/components/schemas/ExerciseVersionResponse"},"type":"array","title":"Versions"},"current_version_id":{"type":"string","title":"Current Version Id"}},"type":"object","required":["versions","current_version_id"],"title":"ExerciseVersionsListResponse","description":"Response model for list of exercise versions."},"FeedbackDetailResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"user_email":{"type":"string","title":"User Email"},"user_name":{"type":"string","title":"User Name"},"user_role":{"type":"string","title":"User Role"},"user_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Country"},"user_grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Grade"},"classes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Classes"},"school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Name"},"feedback":{"type":"string","title":"Feedback"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"status":{"type":"string","enum":["new","in-progress","done"],"title":"Status"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"last_status_changed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status Changed By"},"last_status_changed_by_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status Changed By Name"},"status_changed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Status Changed At"},"replies":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Replies"},"user_feedback_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"User Feedback History"}},"type":"object","required":["id","user_id","user_email","user_name","user_role","user_country","user_grade","classes","school_name","feedback","image_urls","status","timestamp","last_status_changed_by","last_status_changed_by_name","status_changed_at","replies","user_feedback_history"],"title":"FeedbackDetailResponse"},"FeedbackItem":{"properties":{"written_feedback":{"type":"string","title":"Written Feedback"},"classification":{"type":"string","enum":["correct","drawing_not_accurate","explanation_partial","calculation_error","question_interpretation","algebra_error","concept_refresh_needed","notation_confusion","innovative_solution","elegant_phrasing","definition_error"],"title":"Classification"}},"type":"object","required":["written_feedback","classification"],"title":"FeedbackItem"},"FeedbackListItem":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"user_email":{"type":"string","title":"User Email"},"user_name":{"type":"string","title":"User Name"},"feedback_preview":{"type":"string","title":"Feedback Preview"},"status":{"type":"string","enum":["new","in-progress","done"],"title":"Status"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"image_count":{"type":"integer","title":"Image Count"}},"type":"object","required":["id","user_id","user_email","user_name","feedback_preview","status","timestamp","image_count"],"title":"FeedbackListItem"},"FeedbackListResponse":{"properties":{"feedbacks":{"items":{"$ref":"#/components/schemas/FeedbackListItem"},"type":"array","title":"Feedbacks"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["feedbacks","total"],"title":"FeedbackListResponse"},"FeedbackModel":{"properties":{"feedback":{"type":"string","title":"Feedback"},"image_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Image Urls","default":[]}},"type":"object","required":["feedback"],"title":"FeedbackModel"},"FeedbackSubmission":{"properties":{"feedback_items":{"items":{"$ref":"#/components/schemas/FeedbackItem"},"type":"array","title":"Feedback Items"},"media_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Urls"}},"type":"object","required":["feedback_items"],"title":"FeedbackSubmission","description":"Feedback submission from admin."},"FigureGenerationContext":{"properties":{"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"}},"type":"object","title":"FigureGenerationContext"},"FigureGenerationMetadataResponse":{"properties":{"source_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"},"exercise_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Session Id"},"teacher_exam_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Exam Id"},"exam_exercise_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exam Exercise Id"},"block_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Block Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"exercise_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Content"},"reprompted_from_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reprompted From Id"},"solution_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Content"},"exercise_figure_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Figure Code"},"is_solution_figure":{"type":"boolean","title":"Is Solution Figure","default":false},"current_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Code"},"current_diagram_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Diagram Url"}},"type":"object","title":"FigureGenerationMetadataResponse","description":"Response model for figure generation metadata."},"FigureGenerationMetricsSummary":{"properties":{"high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High Rating Rate"},"ratings_count":{"type":"integer","title":"Ratings Count"},"category_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Category Breakdown"},"ratings_with_category":{"type":"integer","title":"Ratings With Category","default":0}},"type":"object","required":["high_rating_rate","ratings_count"],"title":"FigureGenerationMetricsSummary"},"FigureGenerationReviewItem":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"device_type":{"type":"string","title":"Device Type"},"rating":{"type":"integer","title":"Rating"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"figure_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Url"},"figure_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Status"},"source_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"},"is_solution_figure":{"type":"boolean","title":"Is Solution Figure","default":false},"exercise_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Session Id"},"teacher_exam_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Exam Id"},"exam_exercise_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exam Exercise Id"},"generation_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Generation Duration Seconds"}},"type":"object","required":["id","created_at","device_type","rating"],"title":"FigureGenerationReviewItem"},"FiguresListResponse":{"properties":{"figures":{"items":{"$ref":"#/components/schemas/routers__admin_figures__FigureResponse"},"type":"array","title":"Figures"},"stats":{"$ref":"#/components/schemas/FiguresStatsResponse"}},"type":"object","required":["figures","stats"],"title":"FiguresListResponse","description":"Response model for the figures list endpoint."},"FiguresStatsResponse":{"properties":{"total":{"type":"integer","title":"Total"},"completed":{"type":"integer","title":"Completed"},"failed":{"type":"integer","title":"Failed"},"processing":{"type":"integer","title":"Processing"},"pending":{"type":"integer","title":"Pending"},"weekly_new":{"type":"integer","title":"Weekly New"}},"type":"object","required":["total","completed","failed","processing","pending","weekly_new"],"title":"FiguresStatsResponse","description":"Stats about figures."},"FilesUploadRequest":{"properties":{"files":{"items":{"$ref":"#/components/schemas/routers__student_exams__FileUploadRequest"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"FilesUploadRequest"},"FixTranscriptionResponse":{"properties":{"proposed_text":{"type":"string","title":"Proposed Text"}},"type":"object","required":["proposed_text"],"title":"FixTranscriptionResponse"},"FlagRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"is_demo":{"type":"boolean","title":"Is Demo","default":true}},"type":"object","required":["email"],"title":"FlagRequest"},"FlagResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"FlagResponse","description":"Response model for the flag endpoint."},"FlaggedError":{"properties":{"description":{"type":"string","title":"Description"},"evidence":{"items":{"$ref":"#/components/schemas/EvidenceSpan"},"type":"array","title":"Evidence"}},"type":"object","required":["description","evidence"],"title":"FlaggedError","description":"A mistake in the submission not tied to any rubric skill or criterion.\nInformational only — does not affect the grade."},"Flashcard":{"properties":{"_id":{"type":"string","title":"Id"},"course_id":{"type":"string","title":"Course Id"},"unit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Id"},"user_id":{"type":"string","title":"User Id"},"front":{"type":"string","title":"Front"},"back":{"type":"string","title":"Back"},"revision_type":{"anyOf":[{"type":"string","enum":["unit","course_global"]},{"type":"null"}],"title":"Revision Type","default":"unit"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["course_id","user_id","front","back"],"title":"Flashcard","description":"Represents a flashcard generated from a course."},"FlashcardResponse":{"properties":{"id":{"type":"string","title":"Id"},"front":{"type":"string","title":"Front"},"back":{"type":"string","title":"Back"},"unit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Id"}},"type":"object","required":["id","front","back"],"title":"FlashcardResponse"},"FolderCreate":{"properties":{"name":{"type":"string","title":"Name"},"parent_folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Folder Id"},"folder_type":{"type":"string","enum":["teacher_exam","teacher_exercise","teacher_assignment","teacher_course","student_course","student_assignment"],"title":"Folder Type"}},"type":"object","required":["name","folder_type"],"title":"FolderCreate"},"FolderMoveRequest":{"properties":{"parent_folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Folder Id"}},"type":"object","title":"FolderMoveRequest"},"FolderPathItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"FolderPathItem"},"FolderResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"user_id":{"type":"string","title":"User Id"},"parent_folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Folder Id"},"folder_type":{"type":"string","enum":["teacher_exam","teacher_exercise","teacher_assignment","teacher_course","student_course","student_assignment"],"title":"Folder Type"},"sharing_options":{"anyOf":[{"$ref":"#/components/schemas/SharingOptions"},{"type":"null"}]},"is_favorites_root":{"type":"boolean","title":"Is Favorites Root","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","user_id","folder_type","created_at","updated_at"],"title":"FolderResponse"},"FolderUpdate":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"FolderUpdate"},"FrenchSchoolSuggestion":{"properties":{"id":{"type":"string","title":"Id"},"uai":{"type":"string","title":"Uai"},"name":{"type":"string","title":"Name"},"city":{"type":"string","title":"City"},"postal_code":{"type":"string","title":"Postal Code"},"kind":{"type":"string","enum":["france","abroad"],"title":"Kind"},"country":{"type":"string","title":"Country"},"b2b_school":{"anyOf":[{"$ref":"#/components/schemas/SchoolSummary"},{"type":"null"}]}},"type":"object","required":["id","uai","name","city","postal_code","kind","country"],"title":"FrenchSchoolSuggestion"},"FrenchSchoolSummary":{"properties":{"id":{"type":"string","title":"Id"},"uai":{"type":"string","title":"Uai"},"name":{"type":"string","title":"Name"},"city":{"type":"string","title":"City"},"postal_code":{"type":"string","title":"Postal Code"},"kind":{"type":"string","enum":["france","abroad"],"title":"Kind"},"country":{"type":"string","title":"Country"}},"type":"object","required":["id","uai","name","city","postal_code","kind","country"],"title":"FrenchSchoolSummary"},"FrenchSchoolUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal Code"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"uai":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uai"}},"type":"object","title":"FrenchSchoolUpdateRequest","description":"Request model for updating a French school"},"FullClasseStructure":{"properties":{"classe_id":{"type":"string","title":"Classe Id"},"classe_name":{"type":"string","title":"Classe Name"},"chapitres":{"items":{"$ref":"#/components/schemas/ChapitreWithSubChapitres"},"type":"array","title":"Chapitres"}},"type":"object","required":["classe_id","classe_name","chapitres"],"title":"FullClasseStructure","description":"Response model for the full structure of a classe with all chapitres and sub-chapitres."},"GenerateAndImportExercisesResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"created_exercises_count":{"type":"integer","title":"Created Exercises Count","default":0},"processed_exercises":{"items":{"$ref":"#/components/schemas/ProcessedExercise"},"type":"array","title":"Processed Exercises","default":[]},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","default":[]},"generated_tex_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated Tex Preview"}},"type":"object","required":["status","message"],"title":"GenerateAndImportExercisesResponse","description":"Response model for generate-and-import operation"},"GenerateCodesRequest":{"properties":{"count":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Count","description":"Number of codes to generate (1-100)"}},"type":"object","required":["count"],"title":"GenerateCodesRequest"},"GenerateContentRequest":{"properties":{"content_type":{"$ref":"#/components/schemas/ContentType"},"custom_prompt":{"type":"string","title":"Custom Prompt","default":""}},"type":"object","required":["content_type"],"title":"GenerateContentRequest"},"GenerateCorrectionsRequest":{"properties":{"custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Instructions"},"regenerate_all":{"type":"boolean","title":"Regenerate All","default":false}},"type":"object","title":"GenerateCorrectionsRequest"},"GenerateDiagramPreviewRequest":{"properties":{"image_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Image Urls"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"exercise_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Content"},"figure_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Description"},"current_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Code"},"current_diagram_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Diagram Url"}},"type":"object","title":"GenerateDiagramPreviewRequest"},"GenerateDiagramPreviewResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"diagrams":{"items":{"$ref":"#/components/schemas/DiagramPreviewItem"},"type":"array","title":"Diagrams"}},"type":"object","required":["status","message","diagrams"],"title":"GenerateDiagramPreviewResponse"},"GenerateDiagramRequest":{"properties":{"image_url":{"type":"string","title":"Image Url"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"}},"type":"object","required":["image_url"],"title":"GenerateDiagramRequest"},"GenerateExerciseSolutionRequest":{"properties":{"custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Instructions","default":""},"assignment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id"}},"type":"object","title":"GenerateExerciseSolutionRequest"},"GenerateFeedbackResponse":{"properties":{"status":{"type":"string","title":"Status"},"exam":{"$ref":"#/components/schemas/StudentExam"}},"type":"object","required":["status","exam"],"title":"GenerateFeedbackResponse"},"GenerateHintsRequest":{"properties":{"exercise_content":{"type":"string","title":"Exercise Content"},"exercise_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Solution"},"difficulty":{"anyOf":[{"type":"string","enum":["easy","medium","hard"]},{"type":"null"}],"title":"Difficulty"}},"type":"object","required":["exercise_content"],"title":"GenerateHintsRequest","description":"Request model for generating exercise hints via AI"},"GenerateHintsResponse":{"properties":{"hints1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints1"},"hints2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints2"},"hints3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints3"}},"type":"object","title":"GenerateHintsResponse","description":"Response model for generated exercise hints"},"GenerateLatexOptions":{"properties":{"format":{"type":"string","title":"Format","default":"latex"},"field":{"type":"string","enum":["structured_exercises","structured_corrections"],"title":"Field","default":"structured_exercises"},"include_header":{"type":"boolean","title":"Include Header","default":true},"exam_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exam Title"}},"type":"object","title":"GenerateLatexOptions"},"GeneratePdfRequest":{"properties":{"field":{"type":"string","title":"Field"}},"type":"object","required":["field"],"title":"GeneratePdfRequest"},"GenerateSimilarExamExerciseRequest":{"properties":{"custom_prompt":{"type":"string","title":"Custom Prompt","default":"changer les valeurs numériques"}},"type":"object","title":"GenerateSimilarExamExerciseRequest"},"GenerateSimilarExerciseRequest":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"custom_prompt":{"type":"string","title":"Custom Prompt","description":"Custom prompt for AI generation","default":"changer les valeurs numériques"}},"type":"object","required":["exercise_id"],"title":"GenerateSimilarExerciseRequest"},"GenerateSimilarExerciseResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"new_exercise_id":{"type":"string","title":"New Exercise Id"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"},"exercises":{"items":{"$ref":"#/components/schemas/AssignmentExerciseStub"},"type":"array","title":"Exercises"},"added_exercises":{"items":{"$ref":"#/components/schemas/AssignmentExerciseStub"},"type":"array","title":"Added Exercises"}},"type":"object","required":["status","message","new_exercise_id","updated_at","exercise_ids"],"title":"GenerateSimilarExerciseResponse"},"GenerateSolutionRequest":{"properties":{"exercise_content":{"type":"string","title":"Exercise Content"},"difficulty":{"anyOf":[{"type":"string","enum":["easy","medium","hard"]},{"type":"null"}],"title":"Difficulty"}},"type":"object","required":["exercise_content"],"title":"GenerateSolutionRequest","description":"Request model for generating exercise solution via AI"},"GenerateSolutionResponse":{"properties":{"generated_solution":{"type":"string","title":"Generated Solution"}},"type":"object","required":["generated_solution"],"title":"GenerateSolutionResponse","description":"Response model for generated exercise solution"},"GenerateStructuredSubjectRequest":{"properties":{"class_level":{"type":"string","title":"Class Level"},"chapters":{"type":"string","title":"Chapters"},"thematics":{"type":"string","title":"Thematics"},"difficulty":{"type":"integer","title":"Difficulty"},"number_of_exercises":{"type":"integer","title":"Number Of Exercises"},"exam_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exam Title"},"time_limit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Limit"}},"type":"object","required":["class_level","chapters","thematics","difficulty","number_of_exercises"],"title":"GenerateStructuredSubjectRequest"},"GenerateSubjectRequest":{"properties":{"class_level":{"type":"string","title":"Class Level"},"chapters":{"type":"string","title":"Chapters"},"thematics":{"type":"string","title":"Thematics"},"difficulty":{"type":"integer","title":"Difficulty"},"number_of_exercises":{"type":"integer","title":"Number Of Exercises"},"direct_accept":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Direct Accept","default":false}},"type":"object","required":["class_level","chapters","thematics","difficulty","number_of_exercises"],"title":"GenerateSubjectRequest"},"GenerateSubjectWithDetailsRequest":{"properties":{"class_level":{"type":"string","title":"Class Level"},"chapters":{"type":"string","title":"Chapters"},"thematics":{"type":"string","title":"Thematics"},"difficulty":{"type":"integer","title":"Difficulty"},"number_of_exercises":{"type":"integer","title":"Number Of Exercises"},"exam_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exam Title"},"time_limit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Limit"}},"type":"object","required":["class_level","chapters","thematics","difficulty","number_of_exercises"],"title":"GenerateSubjectWithDetailsRequest"},"GetStructuredExercisesResponse":{"properties":{"status":{"type":"string","title":"Status"},"exercises":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Exercises"}},"type":"object","required":["status","exercises"],"title":"GetStructuredExercisesResponse"},"GetStudentExamResponse":{"properties":{"status":{"type":"string","title":"Status"},"exam":{"$ref":"#/components/schemas/StudentExam"}},"type":"object","required":["status","exam"],"title":"GetStudentExamResponse"},"GetStudentExamsResponse":{"properties":{"status":{"type":"string","title":"Status"},"exams":{"items":{"$ref":"#/components/schemas/StudentExam"},"type":"array","title":"Exams"}},"type":"object","required":["status","exams"],"title":"GetStudentExamsResponse"},"GlobalRequirement":{"properties":{"id":{"type":"string","title":"Id"},"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"GlobalRequirement","description":"A global correction requirement applied across the whole copy.\n\nFree-text teacher rule injected into the grading prompt, e.g.\n\"si une réponse est fausse uniquement à cause d'une erreur en amont\nmais que la démarche est correcte, accorder les points\" or comment\nrules like \"vouvoyer l'élève\"."},"GlobalStats":{"properties":{"total_active_students":{"type":"integer","title":"Total Active Students","description":"Total number of active students"},"total_sub_chapitres_completed":{"type":"integer","title":"Total Sub Chapitres Completed","description":"Total number of completed sub-chapters"},"average_completion_rate":{"type":"number","title":"Average Completion Rate","description":"Average completion rate percentage"},"total_exercises_attempted":{"type":"integer","title":"Total Exercises Attempted","description":"Total number of exercises attempted across all students"},"total_exercises_passed":{"type":"integer","title":"Total Exercises Passed","description":"Total number of exercises passed across all students"},"overall_exercise_pass_rate":{"type":"number","title":"Overall Exercise Pass Rate","description":"Overall exercise pass rate percentage"}},"type":"object","required":["total_active_students","total_sub_chapitres_completed","average_completion_rate","total_exercises_attempted","total_exercises_passed","overall_exercise_pass_rate"],"title":"GlobalStats","description":"Global statistics for the holiday course."},"GoogleNativeLoginRequest":{"properties":{"id_token":{"type":"string","title":"Id Token"},"state":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"string"},{"type":"null"}],"title":"State"},"platform":{"anyOf":[{"type":"string","enum":["ios","android","unknown"]},{"type":"null"}],"title":"Platform"}},"type":"object","required":["id_token"],"title":"GoogleNativeLoginRequest"},"GoogleNativeLoginResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["access_token","refresh_token"],"title":"GoogleNativeLoginResponse"},"GradeAssignmentsUpdate":{"properties":{"active_grades":{"items":{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},"type":"array","title":"Active Grades"}},"type":"object","required":["active_grades"],"title":"GradeAssignmentsUpdate"},"GradeInput":{"properties":{"grade":{"type":"string","minLength":1,"title":"Grade"}},"type":"object","required":["grade"],"title":"GradeInput"},"GradesVisibilityRequest":{"properties":{"hidden":{"type":"boolean","title":"Hidden"}},"type":"object","required":["hidden"],"title":"GradesVisibilityRequest"},"GranularCheckSolutionResponse":{"properties":{"status":{"type":"string","title":"Status"},"overall_status":{"type":"string","enum":["passed","failed"],"title":"Overall Status"},"results_by_question":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Results By Question"},"full_student_transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Student Transcript"},"message":{"type":"string","title":"Message"}},"type":"object","required":["status","overall_status","results_by_question","message"],"title":"GranularCheckSolutionResponse","description":"Response for granular solution checking."},"GraphEditRequest":{"properties":{"current_graph_code":{"type":"string","title":"Current Graph Code"},"edit_request":{"type":"string","title":"Edit Request"}},"type":"object","required":["current_graph_code","edit_request"],"title":"GraphEditRequest"},"GraphGenerationRequest":{"properties":{"prompt":{"type":"string","title":"Prompt"}},"type":"object","required":["prompt"],"title":"GraphGenerationRequest"},"GraphGenerationResponse":{"properties":{"graph_code":{"type":"string","title":"Graph Code"}},"type":"object","required":["graph_code"],"title":"GraphGenerationResponse"},"GrowthRevenueResponse":{"properties":{"weeks_analyzed":{"type":"integer","title":"Weeks Analyzed"},"analysis_start_date":{"type":"string","format":"date-time","title":"Analysis Start Date"},"analysis_end_date":{"type":"string","format":"date-time","title":"Analysis End Date"},"paid_establishments":{"type":"integer","title":"Paid Establishments"},"billed_students":{"type":"integer","title":"Billed Students"},"pilot_to_paid_conversion_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pilot To Paid Conversion Rate"},"mrr_eur":{"type":"number","title":"Mrr Eur"},"arr_eur":{"type":"number","title":"Arr Eur"},"avg_revenue_per_school_eur":{"type":"number","title":"Avg Revenue Per School Eur"},"burn_rate_eur_monthly":{"type":"number","title":"Burn Rate Eur Monthly"},"cash_on_hand_eur":{"type":"number","title":"Cash On Hand Eur"},"runway_months":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Runway Months"},"mrr_weekly":{"items":{"$ref":"#/components/schemas/MrrWeeklyPoint"},"type":"array","title":"Mrr Weekly"}},"type":"object","required":["weeks_analyzed","analysis_start_date","analysis_end_date","paid_establishments","billed_students","mrr_eur","arr_eur","avg_revenue_per_school_eur","burn_rate_eur_monthly","cash_on_hand_eur","mrr_weekly"],"title":"GrowthRevenueResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HeatmapDataPoint":{"properties":{"finished":{"type":"integer","title":"Finished"},"total":{"type":"integer","title":"Total"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["finished","total","count"],"title":"HeatmapDataPoint","description":"Single data point for heatmap (finished, total, count)."},"HighlightRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Some highlighted text to ask about."}},"type":"object","required":["text"],"title":"HighlightRequest"},"HistogramBucket":{"properties":{"bucket_start":{"type":"number","title":"Bucket Start"},"bucket_end":{"type":"number","title":"Bucket End"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["bucket_start","bucket_end","count"],"title":"HistogramBucket","description":"Single bucket for ratio histogram."},"HolidayAudioUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"HolidayAudioUploadRequest"},"HolidayBasicResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["status","message"],"title":"HolidayBasicResponse"},"HolidayChatHistoryResponse":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"conversation_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conversation History","default":[]}},"type":"object","required":["exercise_id"],"title":"HolidayChatHistoryResponse"},"HolidayChatRequest":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"message":{"type":"string","title":"Message"},"type":{"type":"string","enum":["text","image_url","image_description","graph"],"title":"Type","default":"text"}},"type":"object","required":["exercise_id","message"],"title":"HolidayChatRequest"},"HolidayCourseAccessStatusResponse":{"properties":{"has_full_access":{"type":"boolean","title":"Has Full Access"}},"type":"object","required":["has_full_access"],"title":"HolidayCourseAccessStatusResponse","description":"Response model for holiday course access status check."},"HolidayCourseChapitre":{"properties":{"_id":{"type":"string","title":"Id"},"name":{"type":"string","minLength":1,"title":"Name"},"classe_id":{"type":"string","title":"Classe Id"},"order":{"type":"integer","title":"Order","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","classe_id"],"title":"HolidayCourseChapitre","description":"Represents a chapter within a holiday course class."},"HolidayCourseClasse":{"properties":{"_id":{"type":"string","title":"Id"},"name":{"type":"string","minLength":1,"title":"Name"},"order":{"type":"integer","title":"Order","default":0},"audience":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name"],"title":"HolidayCourseClasse","description":"Represents the top-level class in the holiday course hierarchy."},"HolidayDashboardResponse":{"properties":{"overall_progress_percentage":{"type":"number","title":"Overall Progress Percentage"},"daily_progress":{"items":{"$ref":"#/components/schemas/DailyProgress"},"type":"array","title":"Daily Progress"},"chapter_progress":{"items":{"$ref":"#/components/schemas/ChapterProgress"},"type":"array","title":"Chapter Progress"},"recent_activity":{"items":{"$ref":"#/components/schemas/RecentActivity"},"type":"array","title":"Recent Activity"},"total_time_spent":{"type":"integer","title":"Total Time Spent"},"total_sub_chapitres":{"type":"integer","title":"Total Sub Chapitres"},"completed_sub_chapitres":{"type":"integer","title":"Completed Sub Chapitres"},"total_exercises_attempted":{"type":"integer","title":"Total Exercises Attempted"},"total_revision_sessions":{"type":"integer","title":"Total Revision Sessions"}},"type":"object","required":["overall_progress_percentage","daily_progress","chapter_progress","recent_activity","total_time_spent","total_sub_chapitres","completed_sub_chapitres","total_exercises_attempted","total_revision_sessions"],"title":"HolidayDashboardResponse","description":"Complete dashboard response structure."},"HolidayExerciseCreatePayload":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"type":"string","title":"Content"},"solution":{"type":"string","title":"Solution"},"difficulty":{"type":"string","enum":["easy","medium","hard"],"title":"Difficulty"},"hints1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints1"},"hints2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints2"},"hints3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints3"}},"type":"object","required":["content","solution","difficulty"],"title":"HolidayExerciseCreatePayload","description":"Request model for creating a holiday course exercise"},"HolidayExerciseForStudent":{"properties":{"_id":{"type":"string","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"type":"string","title":"Content"},"solution":{"type":"string","title":"Solution"},"difficulty":{"type":"string","enum":["easy","medium","hard"],"title":"Difficulty"},"hints1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints1"},"hints2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints2"},"hints3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints3"},"sub_questions":{"anyOf":[{"items":{"$ref":"#/components/schemas/HolidaySubQuestion"},"type":"array"},{"type":"null"}],"title":"Sub Questions"},"created_by_admin_id":{"type":"string","title":"Created By Admin Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"link_id":{"type":"string","title":"Link Id"},"is_default":{"type":"boolean","title":"Is Default"},"attempt_status":{"anyOf":[{"type":"string","enum":["passed","failed"]},{"type":"null"}],"title":"Attempt Status"}},"type":"object","required":["content","solution","difficulty","created_by_admin_id","link_id","is_default"],"title":"HolidayExerciseForStudent","description":"Response model for exercises available to a student for a specific sub-chapitre.\nInherits all fields from HolidayCourseExercise and adds link and attempt information."},"HolidayExerciseResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"type":"string","title":"Content"},"solution":{"type":"string","title":"Solution"},"difficulty":{"type":"string","title":"Difficulty"},"hints1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints1"},"hints2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints2"},"hints3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints3"},"created_by_admin_id":{"type":"string","title":"Created By Admin Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","content","solution","difficulty","created_by_admin_id","created_at","updated_at"],"title":"HolidayExerciseResponse","description":"Response model for holiday course exercise"},"HolidayExerciseUpdatePayload":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution"},"difficulty":{"anyOf":[{"type":"string","enum":["easy","medium","hard"]},{"type":"null"}],"title":"Difficulty"},"hints1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints1"},"hints2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints2"},"hints3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints3"}},"type":"object","title":"HolidayExerciseUpdatePayload","description":"Request model for updating a holiday course exercise"},"HolidaySubQuestion":{"properties":{"identifier":{"type":"string","title":"Identifier"},"label":{"type":"string","title":"Label"}},"type":"object","required":["identifier","label"],"title":"HolidaySubQuestion","description":"A canonical, frozen sub-question of a holiday-course exercise.\n\nDerived once from the énoncé and stored so that grading reports the SAME set\nof sub-questions on every attempt. Without it the grader re-segments the\nexercise each time (e.g. confusing solution steps like \"Initialisation\" /\n\"Hérédité\" with actual sub-questions), so a student who retries can see the\nquestion count change from one attempt to the next."},"HolidayWorkbookCheckoutRequest":{"properties":{"promoCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promocode"}},"type":"object","title":"HolidayWorkbookCheckoutRequest"},"HomeData":{"properties":{"full_name":{"type":"string","title":"Full Name"},"next_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Session Id"},"unseen_feedback_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unseen Feedback Session Id"},"total_xp":{"type":"integer","title":"Total Xp","default":0},"past_sessions":{"items":{"$ref":"#/components/schemas/SessionInfo"},"type":"array","title":"Past Sessions","default":[]},"upcoming_sessions":{"items":{"$ref":"#/components/schemas/SessionInfo"},"type":"array","title":"Upcoming Sessions","default":[]}},"type":"object","required":["full_name"],"title":"HomeData","description":"Pydantic model for returning the Home page data."},"HomeRedesignMetricsSummary":{"properties":{"high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High Rating Rate"},"ratings_count":{"type":"integer","title":"Ratings Count"},"category_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Category Breakdown"},"ratings_with_category":{"type":"integer","title":"Ratings With Category","default":0}},"type":"object","required":["high_rating_rate","ratings_count"],"title":"HomeRedesignMetricsSummary"},"HomeRedesignReviewItem":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"device_type":{"type":"string","title":"Device Type"},"rating":{"type":"integer","title":"Rating"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"prompt_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prompt Index"},"question":{"type":"string","title":"Question"}},"type":"object","required":["id","created_at","device_type","rating","question"],"title":"HomeRedesignReviewItem"},"HomeworkHelperSummary":{"properties":{"session_id":{"type":"string","title":"Session Id"},"teacher_exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Exercise Id"},"title":{"type":"string","title":"Title"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"solution_status":{"type":"string","enum":["pending","ready"],"title":"Solution Status"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"}},"type":"object","required":["session_id","teacher_exercise_id","title","created_at","updated_at","solution_status"],"title":"HomeworkHelperSummary"},"HumanAuthor":{"properties":{"type":{"type":"string","const":"human","title":"Type","default":"human"},"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"HumanAuthor"},"IgnoreAction":{"properties":{"action":{"type":"string","const":"ignore","title":"Action"}},"type":"object","required":["action"],"title":"IgnoreAction"},"ImageTranscriptionRequest":{"properties":{"images":{"items":{"type":"string"},"type":"array","title":"Images"}},"type":"object","required":["images"],"title":"ImageTranscriptionRequest","description":"Request model for image transcription."},"ImageUploadResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"url":{"type":"string","title":"Url"}},"type":"object","required":["status","message","url"],"title":"ImageUploadResponse"},"ImageUrlRequest":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"ImageUrlRequest"},"ImagesRequest":{"properties":{"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"}},"type":"object","required":["image_urls"],"title":"ImagesRequest"},"ImportRequest":{"properties":{"templates":{"items":{"$ref":"#/components/schemas/TemplateWithVariations"},"type":"array","title":"Templates"}},"type":"object","required":["templates"],"title":"ImportRequest","description":"Request model for importing templates and variations"},"ImportTeacherExercisesRequest":{"properties":{"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"}},"type":"object","required":["exercise_ids"],"title":"ImportTeacherExercisesRequest"},"InboxOpenedResponse":{"properties":{"last_inbox_opened_at":{"type":"string","format":"date-time","title":"Last Inbox Opened At"}},"type":"object","required":["last_inbox_opened_at"],"title":"InboxOpenedResponse"},"InvitationAcceptRequest":{"properties":{"password":{"type":"string","minLength":8,"title":"Password"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"}},"type":"object","required":["password"],"title":"InvitationAcceptRequest"},"InvitationAcceptResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["success","user_id","email"],"title":"InvitationAcceptResponse"},"InvitationPublicInfoResponse":{"properties":{"email":{"type":"string","title":"Email"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"school_name":{"type":"string","title":"School Name"},"status":{"type":"string","enum":["pending","accepted","expired"],"title":"Status"}},"type":"object","required":["email","school_name","status"],"title":"InvitationPublicInfoResponse"},"JoinLeaderboardRequest":{"properties":{"leaderboard_username":{"type":"string","title":"Leaderboard Username"}},"type":"object","required":["leaderboard_username"],"title":"JoinLeaderboardRequest"},"KnowledgeQuizSettings":{"properties":{"is_enabled":{"type":"boolean","title":"Is Enabled","default":true},"max_attempts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Attempts"},"show_correct_answers_after":{"type":"boolean","title":"Show Correct Answers After","default":true},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"}},"type":"object","title":"KnowledgeQuizSettings","description":"Settings for the knowledge quiz on a course assignment.\nConfigurable by the teacher when assigning a course."},"LatencyStats":{"properties":{"count":{"type":"integer","title":"Count"},"avg_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Seconds"},"p50_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P50 Seconds"},"p90_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P90 Seconds"},"max_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Seconds"}},"type":"object","required":["count"],"title":"LatencyStats","description":"Grading latency (posted -> graded), seconds. Graded attempts only."},"LeaderboardEntry":{"properties":{"user_id":{"type":"string","title":"User Id"},"display_name":{"type":"string","title":"Display Name"},"board_size":{"type":"integer","title":"Board Size"},"time_seconds":{"type":"number","title":"Time Seconds"},"submitted_at":{"type":"string","format":"date-time","title":"Submitted At"},"rank":{"type":"integer","title":"Rank"},"is_current_user":{"type":"boolean","title":"Is Current User","default":false}},"type":"object","required":["user_id","display_name","board_size","time_seconds","submitted_at","rank"],"title":"LeaderboardEntry"},"LeaderboardUserResponse":{"properties":{"leaderboard_username":{"type":"string","title":"Leaderboard Username"},"level":{"type":"integer","title":"Level"},"xp":{"type":"integer","title":"Xp"},"level_name":{"type":"string","title":"Level Name"},"level_altitude":{"type":"string","title":"Level Altitude"},"joined_at":{"type":"string","format":"date-time","title":"Joined At"},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank"},"is_current_user":{"type":"boolean","title":"Is Current User","default":false}},"type":"object","required":["leaderboard_username","level","xp","level_name","level_altitude","joined_at"],"title":"LeaderboardUserResponse"},"LegacySubmissionRefResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exercise_id":{"type":"string","title":"Exercise Id"}},"type":"object","required":["session_id","exercise_id"],"title":"LegacySubmissionRefResponse","description":"Frontend-visible identifier for a v1-graded submission needing\nre-evaluation. The teacher results page loops these through the\nre-eval endpoint when the \"Réévaluer\" banner button is clicked.\n\nHotfix scaffolding — removable with `legacy_submissions` once the\nbacklog is drained."},"Level":{"properties":{"level":{"type":"integer","title":"Level"},"title":{"type":"string","title":"Title"},"questions":{"items":{"type":"string"},"type":"array","title":"Questions"}},"type":"object","required":["level","title","questions"],"title":"Level"},"LevelDefinitionResponse":{"properties":{"level":{"type":"integer","title":"Level"},"name":{"type":"string","title":"Name"},"altitude":{"type":"string","title":"Altitude"},"xp_required":{"type":"integer","title":"Xp Required"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"}},"type":"object","required":["level","name","altitude","xp_required"],"title":"LevelDefinitionResponse"},"LevelSelectionHistory":{"properties":{"level":{"type":"integer","title":"Level"},"selection":{"type":"integer","title":"Selection"},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["level","selection"],"title":"LevelSelectionHistory","description":"Represents a single level and selection pair in the onboarding assessment."},"LevelSelectionHistoryInput":{"properties":{"level":{"type":"integer","title":"Level"},"selection":{"type":"integer","title":"Selection"},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"timestamp":{"type":"string","title":"Timestamp"}},"type":"object","required":["level","selection","timestamp"],"title":"LevelSelectionHistoryInput"},"LinkExerciseToSubChapitrePayload":{"properties":{"holiday_course_exercise_id":{"type":"string","title":"Holiday Course Exercise Id"},"is_default_for_sub_chapitre":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Default For Sub Chapitre","default":false}},"type":"object","required":["holiday_course_exercise_id"],"title":"LinkExerciseToSubChapitrePayload","description":"Request model for linking an exercise to a sub-chapitre"},"LinkedExerciseDetail":{"properties":{"id":{"type":"string","title":"Id"},"sub_chapitre_id":{"type":"string","title":"Sub Chapitre Id"},"holiday_course_exercise_id":{"type":"string","title":"Holiday Course Exercise Id"},"is_default_for_sub_chapitre":{"type":"boolean","title":"Is Default For Sub Chapitre"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"exercise_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Title"},"exercise_difficulty":{"type":"string","title":"Exercise Difficulty"},"exercise_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Content"},"exercise_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Solution"},"exercise_hints1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Hints1"},"exercise_hints2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Hints2"},"exercise_hints3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Hints3"}},"type":"object","required":["id","sub_chapitre_id","holiday_course_exercise_id","is_default_for_sub_chapitre","created_at","exercise_difficulty"],"title":"LinkedExerciseDetail","description":"Response model for linked exercise with details"},"LogContentCompletionPayload":{"properties":{"sub_chapitre_id":{"type":"string","title":"Sub Chapitre Id"},"course_id":{"type":"string","title":"Course Id"}},"type":"object","required":["sub_chapitre_id","course_id"],"title":"LogContentCompletionPayload","description":"Payload for logging when a student completes viewing a SubChapitre's content."},"LogFlashcardInteractionPayload":{"properties":{"course_id":{"type":"string","title":"Course Id"},"teacher_course_assignment_id":{"type":"string","title":"Teacher Course Assignment Id"},"flashcard_id":{"type":"string","title":"Flashcard Id"},"unit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Id"},"action":{"type":"string","enum":["flipped","rated_known","rated_unknown"],"title":"Action"}},"type":"object","required":["course_id","teacher_course_assignment_id","flashcard_id","action"],"title":"LogFlashcardInteractionPayload","description":"Payload for logging flashcard interactions."},"LogHolidayExerciseAttemptPayload":{"properties":{"sub_chapitre_id":{"type":"string","title":"Sub Chapitre Id"},"holiday_course_exercise_id":{"type":"string","title":"Holiday Course Exercise Id"},"status":{"type":"string","enum":["passed","failed"],"title":"Status"}},"type":"object","required":["sub_chapitre_id","holiday_course_exercise_id","status"],"title":"LogHolidayExerciseAttemptPayload","description":"Payload for logging holiday exercise attempts."},"LogHolidayFlashcardInteractionPayload":{"properties":{"student_id":{"type":"string","title":"Student Id"},"course_id":{"type":"string","title":"Course Id"},"sub_chapitre_id":{"type":"string","title":"Sub Chapitre Id"},"flashcard_id":{"type":"string","title":"Flashcard Id"},"unit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Id"},"action":{"type":"string","enum":["flipped","rated_known","rated_unknown"],"title":"Action"}},"type":"object","required":["student_id","course_id","sub_chapitre_id","flashcard_id","action"],"title":"LogHolidayFlashcardInteractionPayload","description":"Payload for logging holiday course flashcard interactions."},"LogHolidayQCMAnswerPayload":{"properties":{"student_id":{"type":"string","title":"Student Id"},"course_id":{"type":"string","title":"Course Id"},"sub_chapitre_id":{"type":"string","title":"Sub Chapitre Id"},"qcm_id":{"type":"string","title":"Qcm Id"},"unit_id":{"type":"string","title":"Unit Id"},"selected_option_index":{"type":"integer","title":"Selected Option Index"},"is_correct":{"type":"boolean","title":"Is Correct"}},"type":"object","required":["student_id","course_id","sub_chapitre_id","qcm_id","unit_id","selected_option_index","is_correct"],"title":"LogHolidayQCMAnswerPayload","description":"Payload for logging holiday course QCM answers."},"LogHolidayRevisionCompletionPayload":{"properties":{"course_id":{"type":"string","title":"Course Id"},"total_flashcards":{"type":"integer","title":"Total Flashcards"},"known_first_time":{"type":"integer","title":"Known First Time"},"known_after_retry":{"type":"integer","title":"Known After Retry"},"still_difficult":{"type":"integer","title":"Still Difficult"},"session_duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Duration Seconds"}},"type":"object","required":["course_id","total_flashcards","known_first_time","known_after_retry","still_difficult"],"title":"LogHolidayRevisionCompletionPayload","description":"Payload for logging holiday course revision completion."},"LogHolidayTimeSpentPayload":{"properties":{"student_id":{"type":"string","title":"Student Id"},"course_id":{"type":"string","title":"Course Id"},"sub_chapitre_id":{"type":"string","title":"Sub Chapitre Id"},"total_time_spent_seconds":{"type":"integer","title":"Total Time Spent Seconds"}},"type":"object","required":["student_id","course_id","sub_chapitre_id","total_time_spent_seconds"],"title":"LogHolidayTimeSpentPayload","description":"Payload for logging holiday course time spent."},"LogHolidayUnitViewPayload":{"properties":{"student_id":{"type":"string","title":"Student Id"},"course_id":{"type":"string","title":"Course Id"},"sub_chapitre_id":{"type":"string","title":"Sub Chapitre Id"},"unit_id":{"type":"string","title":"Unit Id"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"}},"type":"object","required":["student_id","course_id","sub_chapitre_id","unit_id"],"title":"LogHolidayUnitViewPayload","description":"Payload for logging holiday course unit views."},"LogPlayBody":{"properties":{"board_size":{"type":"integer","title":"Board Size"},"correction_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correction Session Id"}},"type":"object","required":["board_size"],"title":"LogPlayBody"},"LogQCMAnswerPayload":{"properties":{"course_id":{"type":"string","title":"Course Id"},"teacher_course_assignment_id":{"type":"string","title":"Teacher Course Assignment Id"},"qcm_id":{"type":"string","title":"Qcm Id"},"unit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Id"},"selected_option_index":{"type":"integer","title":"Selected Option Index"},"is_correct":{"type":"boolean","title":"Is Correct"}},"type":"object","required":["course_id","teacher_course_assignment_id","qcm_id","selected_option_index","is_correct"],"title":"LogQCMAnswerPayload","description":"Payload for logging QCM answer attempts."},"LogTimeSpentPayload":{"properties":{"course_id":{"type":"string","title":"Course Id"},"teacher_course_assignment_id":{"type":"string","title":"Teacher Course Assignment Id"},"total_time_spent_seconds":{"type":"integer","title":"Total Time Spent Seconds"}},"type":"object","required":["course_id","teacher_course_assignment_id","total_time_spent_seconds"],"title":"LogTimeSpentPayload","description":"Payload for logging total time spent on a course."},"LogTranscriptionRequest":{"properties":{"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"transcription":{"type":"string","title":"Transcription"},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"}},"type":"object","required":["image_urls","transcription"],"title":"LogTranscriptionRequest"},"LogUnitViewPayload":{"properties":{"course_id":{"type":"string","title":"Course Id"},"teacher_course_assignment_id":{"type":"string","title":"Teacher Course Assignment Id"},"unit_id":{"type":"string","title":"Unit Id"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"}},"type":"object","required":["course_id","teacher_course_assignment_id","unit_id"],"title":"LogUnitViewPayload","description":"Payload for logging when a student views a unit."},"LoginModel":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginModel"},"MarkAsSeenRequest":{"properties":{"update_ids":{"items":{"type":"string"},"type":"array","title":"Update Ids","description":"List of release update IDs to mark as seen"}},"type":"object","required":["update_ids"],"title":"MarkAsSeenRequest"},"MarkNodesVisitedRequest":{"properties":{"nodeIds":{"items":{"type":"string"},"type":"array","title":"Nodeids","default":[]}},"type":"object","title":"MarkNodesVisitedRequest"},"MasteryCellResponse":{"properties":{"mastery":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mastery"},"bucket":{"type":"string","enum":["a_reprendre","en_progres","maitrise","non_traite"],"title":"Bucket"},"correct":{"type":"integer","title":"Correct"},"partial":{"type":"integer","title":"Partial"},"wrong":{"type":"integer","title":"Wrong"}},"type":"object","required":["bucket","correct","partial","wrong"],"title":"MasteryCellResponse","description":"One square. `mastery` is `null` for never probed, which the UI renders\ngrey — distinct from 0, which is red.\n\nThe tally travels with the score because a 0.5 from one partial and a 0.5\nfrom a correct-plus-wrong are the same number and very different\nsituations; the tooltip shows the counts so a teacher can tell them\napart."},"MasteryStudentResponse":{"properties":{"student_id":{"type":"string","title":"Student Id"},"display_name":{"type":"string","title":"Display Name"}},"type":"object","required":["student_id","display_name"],"title":"MasteryStudentResponse","description":"One entry of the positional index the strips are read against."},"MasteryThresholdsResponse":{"properties":{"a_reprendre":{"type":"number","title":"A Reprendre"},"maitrise":{"type":"number","title":"Maitrise"}},"type":"object","required":["a_reprendre","maitrise"],"title":"MasteryThresholdsResponse","description":"The bucket edges, sent so the legend and any client-side colouring read\nthe same numbers the server bucketed with instead of restating them."},"MergeExercisesRequest":{"properties":{"exercise_ids":{"items":{"type":"string"},"type":"array","minItems":2,"title":"Exercise Ids"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"type":"object","required":["exercise_ids"],"title":"MergeExercisesRequest"},"MethodBreakdown":{"properties":{"method":{"type":"string","title":"Method"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["method","count"],"title":"MethodBreakdown"},"MobileToolbarBehaviorDeltaMetrics":{"properties":{"active_mobile_students":{"type":"integer","title":"Active Mobile Students"},"mobile_exercises_started":{"type":"integer","title":"Mobile Exercises Started"},"mobile_exercises_completed":{"type":"integer","title":"Mobile Exercises Completed"},"mobile_exercise_completion_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mobile Exercise Completion Rate"},"mobile_chat_open_students":{"type":"integer","title":"Mobile Chat Open Students"},"mobile_chat_opens":{"type":"integer","title":"Mobile Chat Opens"},"mobile_chat_open_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mobile Chat Open Rate"},"mobile_chat_messages":{"type":"integer","title":"Mobile Chat Messages"},"mobile_chat_messages_per_active_student_per_day":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mobile Chat Messages Per Active Student Per Day"},"beta_opt_ins":{"type":"integer","title":"Beta Opt Ins"},"beta_rollbacks":{"type":"integer","title":"Beta Rollbacks"},"beta_opt_in_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Beta Opt In Rate"},"beta_rollback_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Beta Rollback Rate"}},"type":"object","required":["active_mobile_students","mobile_exercises_started","mobile_exercises_completed","mobile_exercise_completion_rate","mobile_chat_open_students","mobile_chat_opens","mobile_chat_open_rate","mobile_chat_messages","mobile_chat_messages_per_active_student_per_day","beta_opt_ins","beta_rollbacks","beta_opt_in_rate","beta_rollback_rate"],"title":"MobileToolbarBehaviorDeltaMetrics"},"MobileToolbarBehaviorSummary":{"properties":{"baseline":{"$ref":"#/components/schemas/MobileToolbarBehaviorWindowMetrics"},"current":{"$ref":"#/components/schemas/MobileToolbarBehaviorWindowMetrics"},"delta":{"$ref":"#/components/schemas/MobileToolbarBehaviorDeltaMetrics"}},"type":"object","required":["baseline","current","delta"],"title":"MobileToolbarBehaviorSummary"},"MobileToolbarBehaviorWindowMetrics":{"properties":{"start":{"type":"string","format":"date-time","title":"Start"},"end":{"type":"string","format":"date-time","title":"End"},"student_count":{"type":"integer","title":"Student Count"},"active_mobile_students":{"type":"integer","title":"Active Mobile Students"},"mobile_exercises_started":{"type":"integer","title":"Mobile Exercises Started"},"mobile_exercises_completed":{"type":"integer","title":"Mobile Exercises Completed"},"mobile_exercise_completion_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mobile Exercise Completion Rate"},"mobile_chat_open_students":{"type":"integer","title":"Mobile Chat Open Students"},"mobile_chat_opens":{"type":"integer","title":"Mobile Chat Opens"},"mobile_chat_open_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mobile Chat Open Rate"},"mobile_chat_messages":{"type":"integer","title":"Mobile Chat Messages"},"mobile_chat_messages_per_active_student_per_day":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mobile Chat Messages Per Active Student Per Day"},"beta_opt_ins":{"type":"integer","title":"Beta Opt Ins"},"beta_rollbacks":{"type":"integer","title":"Beta Rollbacks"},"beta_opt_in_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Beta Opt In Rate"},"beta_rollback_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Beta Rollback Rate"}},"type":"object","required":["start","end","student_count","active_mobile_students","mobile_exercises_started","mobile_exercises_completed","mobile_exercise_completion_rate","mobile_chat_open_students","mobile_chat_opens","mobile_chat_open_rate","mobile_chat_messages","mobile_chat_messages_per_active_student_per_day","beta_opt_ins","beta_rollbacks","beta_opt_in_rate","beta_rollback_rate"],"title":"MobileToolbarBehaviorWindowMetrics"},"MobileToolbarExperimentDiagnostics":{"properties":{"eligible_population":{"type":"integer","title":"Eligible Population"},"treatment_size":{"type":"integer","title":"Treatment Size"},"control_size":{"type":"integer","title":"Control Size"},"excluded_mid_window_roll_ins":{"type":"integer","title":"Excluded Mid Window Roll Ins"},"excluded_self_opt_ins":{"type":"integer","title":"Excluded Self Opt Ins"},"first_treatment_assignment_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Treatment Assignment At"},"latest_treatment_assignment_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest Treatment Assignment At"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["eligible_population","treatment_size","control_size","excluded_mid_window_roll_ins","excluded_self_opt_ins"],"title":"MobileToolbarExperimentDiagnostics"},"MobileToolbarExperimentMetricComparison":{"properties":{"metric_id":{"type":"string","title":"Metric Id"},"label":{"type":"string","title":"Label"},"value_type":{"type":"string","title":"Value Type"},"treatment_current":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Treatment Current"},"control_current":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Control Current"},"current_difference":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current Difference"},"treatment_baseline":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Treatment Baseline"},"control_baseline":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Control Baseline"},"baseline_difference":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Baseline Difference"},"difference_in_differences":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Difference In Differences"}},"type":"object","required":["metric_id","label","value_type","treatment_current","control_current","current_difference","treatment_baseline","control_baseline","baseline_difference","difference_in_differences"],"title":"MobileToolbarExperimentMetricComparison"},"MobileToolbarExperimentSummary":{"properties":{"baseline_start":{"type":"string","format":"date-time","title":"Baseline Start"},"baseline_end":{"type":"string","format":"date-time","title":"Baseline End"},"current_start":{"type":"string","format":"date-time","title":"Current Start"},"current_end":{"type":"string","format":"date-time","title":"Current End"},"treatment_baseline":{"$ref":"#/components/schemas/MobileToolbarExperimentWindowMetrics"},"treatment_current":{"$ref":"#/components/schemas/MobileToolbarExperimentWindowMetrics"},"control_baseline":{"$ref":"#/components/schemas/MobileToolbarExperimentWindowMetrics"},"control_current":{"$ref":"#/components/schemas/MobileToolbarExperimentWindowMetrics"},"comparisons":{"items":{"$ref":"#/components/schemas/MobileToolbarExperimentMetricComparison"},"type":"array","title":"Comparisons"},"diagnostics":{"$ref":"#/components/schemas/MobileToolbarExperimentDiagnostics"}},"type":"object","required":["baseline_start","baseline_end","current_start","current_end","treatment_baseline","treatment_current","control_baseline","control_current","comparisons","diagnostics"],"title":"MobileToolbarExperimentSummary"},"MobileToolbarExperimentWindowMetrics":{"properties":{"start":{"type":"string","format":"date-time","title":"Start"},"end":{"type":"string","format":"date-time","title":"End"},"student_count":{"type":"integer","title":"Student Count"},"active_mobile_students":{"type":"integer","title":"Active Mobile Students"},"active_mobile_student_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Active Mobile Student Rate"},"mobile_exercise_completion_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mobile Exercise Completion Rate"},"mobile_chat_open_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mobile Chat Open Rate"},"mobile_chat_messages_per_active_student_per_day":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mobile Chat Messages Per Active Student Per Day"},"csat_high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Csat High Rating Rate"},"csat_ratings_count":{"type":"integer","title":"Csat Ratings Count"}},"type":"object","required":["start","end","student_count","active_mobile_students","active_mobile_student_rate","mobile_exercise_completion_rate","mobile_chat_open_rate","mobile_chat_messages_per_active_student_per_day","csat_high_rating_rate","csat_ratings_count"],"title":"MobileToolbarExperimentWindowMetrics"},"MobileToolbarRedesignChatOpenedRequest":{"properties":{"device_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Type"}},"type":"object","title":"MobileToolbarRedesignChatOpenedRequest"},"MobileToolbarRedesignChatOpenedResponse":{"properties":{"success":{"type":"boolean","title":"Success"}},"type":"object","required":["success"],"title":"MobileToolbarRedesignChatOpenedResponse"},"MobileToolbarRedesignHomeTourClaimResponse":{"properties":{"should_show":{"type":"boolean","title":"Should Show"}},"type":"object","required":["should_show"],"title":"MobileToolbarRedesignHomeTourClaimResponse"},"MobileToolbarRedesignHomeTourSeenResponse":{"properties":{"success":{"type":"boolean","title":"Success"}},"type":"object","required":["success"],"title":"MobileToolbarRedesignHomeTourSeenResponse"},"MobileToolbarRedesignMetricsSummary":{"properties":{"high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High Rating Rate"},"ratings_count":{"type":"integer","title":"Ratings Count"},"category_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Category Breakdown"},"ratings_with_category":{"type":"integer","title":"Ratings With Category","default":0}},"type":"object","required":["high_rating_rate","ratings_count"],"title":"MobileToolbarRedesignMetricsSummary"},"MobileToolbarRedesignReviewItem":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"device_type":{"type":"string","title":"Device Type"},"rating":{"type":"integer","title":"Rating"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"prompt_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prompt Index"},"question":{"type":"string","title":"Question"}},"type":"object","required":["id","created_at","device_type","rating","question"],"title":"MobileToolbarRedesignReviewItem"},"MonthlyRetentionPoint":{"properties":{"month":{"type":"string","title":"Month"},"month_start":{"type":"string","format":"date-time","title":"Month Start"},"month_end":{"type":"string","format":"date-time","title":"Month End"},"base_mrr_eur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Base Mrr Eur"},"retained_mrr_eur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Retained Mrr Eur"},"expansion_mrr_eur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Expansion Mrr Eur"},"grr_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Grr Pct"},"nrr_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Nrr Pct"}},"type":"object","required":["month","month_start","month_end"],"title":"MonthlyRetentionPoint"},"MonthlyStudentActivity":{"properties":{"month":{"type":"string","title":"Month"},"month_label":{"type":"string","title":"Month Label"},"courses_created":{"type":"integer","title":"Courses Created"},"exercise_sessions_practice":{"type":"integer","title":"Exercise Sessions Practice"},"exercise_sessions_assignment":{"type":"integer","title":"Exercise Sessions Assignment"},"ai_tutor_hours":{"type":"number","title":"Ai Tutor Hours"}},"type":"object","required":["month","month_label","courses_created","exercise_sessions_practice","exercise_sessions_assignment","ai_tutor_hours"],"title":"MonthlyStudentActivity"},"MonthlyTeacherActivity":{"properties":{"month":{"type":"string","title":"Month"},"month_label":{"type":"string","title":"Month Label"},"assignments_created":{"type":"integer","title":"Assignments Created"},"exercises_created":{"type":"integer","title":"Exercises Created"},"exams_created":{"type":"integer","title":"Exams Created"},"courses_created":{"type":"integer","title":"Courses Created"}},"type":"object","required":["month","month_label","assignments_created","exercises_created","exams_created","courses_created"],"title":"MonthlyTeacherActivity"},"MoveAssignmentToFolderRequest":{"properties":{"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"type":"object","title":"MoveAssignmentToFolderRequest"},"MoveCourseRequest":{"properties":{"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"type":"object","title":"MoveCourseRequest"},"MoveCourseToFolderRequest":{"properties":{"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"type":"object","title":"MoveCourseToFolderRequest","description":"Request model for moving a course to a folder."},"MoveExamToFolderRequest":{"properties":{"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"type":"object","title":"MoveExamToFolderRequest"},"MoveExerciseToFolderRequest":{"properties":{"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"type":"object","title":"MoveExerciseToFolderRequest"},"MoveToFolderRequest":{"properties":{"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"type":"object","title":"MoveToFolderRequest"},"MrrWeeklyPoint":{"properties":{"week":{"type":"string","title":"Week"},"week_start":{"type":"string","format":"date-time","title":"Week Start"},"week_end":{"type":"string","format":"date-time","title":"Week End"},"mrr_eur":{"type":"number","title":"Mrr Eur"},"mrr_ma4_eur":{"type":"number","title":"Mrr Ma4 Eur"},"mrr_growth_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mrr Growth Pct"}},"type":"object","required":["week","week_start","week_end","mrr_eur","mrr_ma4_eur"],"title":"MrrWeeklyPoint"},"MultimodalSummary":{"properties":{"start":{"type":"string","format":"date-time","title":"Start"},"end":{"type":"string","format":"date-time","title":"End"},"total_attempts":{"type":"integer","title":"Total Attempts"},"total_envois":{"type":"integer","title":"Total Envois"},"unique_students":{"type":"integer","title":"Unique Students"},"unique_sessions":{"type":"integer","title":"Unique Sessions"},"status_counts":{"items":{"$ref":"#/components/schemas/CountItem"},"type":"array","title":"Status Counts"},"stuck_processing":{"type":"integer","title":"Stuck Processing"},"latency":{"$ref":"#/components/schemas/LatencyStats"},"scope_split":{"items":{"$ref":"#/components/schemas/ScopeSplit"},"type":"array","title":"Scope Split"},"device_split":{"items":{"$ref":"#/components/schemas/CountItem"},"type":"array","title":"Device Split"},"photos_per_attempt":{"items":{"$ref":"#/components/schemas/CountItem"},"type":"array","title":"Photos Per Attempt"},"avg_photos_per_attempt":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Photos Per Attempt"},"correctness_split":{"items":{"$ref":"#/components/schemas/CountItem"},"type":"array","title":"Correctness Split"},"avg_grade_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Grade Ratio"},"with_transcription":{"type":"integer","title":"With Transcription"},"assignment_attempts":{"type":"integer","title":"Assignment Attempts"},"self_practice_attempts":{"type":"integer","title":"Self Practice Attempts"},"daily":{"items":{"$ref":"#/components/schemas/DailyPoint"},"type":"array","title":"Daily"},"top_errors":{"items":{"$ref":"#/components/schemas/CountItem"},"type":"array","title":"Top Errors"},"rejection_reasons":{"items":{"$ref":"#/components/schemas/CountItem"},"type":"array","title":"Rejection Reasons"}},"type":"object","required":["start","end","total_attempts","total_envois","unique_students","unique_sessions","status_counts","stuck_processing","latency","scope_split","device_split","photos_per_attempt","correctness_split","with_transcription","assignment_attempts","self_practice_attempts","daily","top_errors","rejection_reasons"],"title":"MultimodalSummary"},"MySubjectsResponse":{"properties":{"subjects":{"items":{"type":"string","enum":["maths","physique-chimie"]},"type":"array","title":"Subjects"}},"type":"object","title":"MySubjectsResponse","description":"The matières available to the current user.\n\nDrives the global matière filter: with a single matière there is nothing\nto filter, so the client hides the control entirely rather than offering\nan option that empties every page."},"NetworkEntry":{"properties":{"method":{"type":"string","title":"Method"},"url":{"type":"string","title":"Url"},"status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"at":{"type":"string","format":"date-time","title":"At"},"response_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Body"}},"type":"object","required":["method","url","at"],"title":"NetworkEntry"},"NewTopicRequest":{"properties":{"course_id":{"type":"string","title":"Course Id"},"unit_index":{"type":"integer","title":"Unit Index"},"module_index":{"type":"integer","title":"Module Index"},"topic_number":{"type":"string","title":"Topic Number"},"topic_title":{"type":"string","title":"Topic Title"}},"type":"object","required":["course_id","unit_index","module_index","topic_number","topic_title"],"title":"NewTopicRequest","description":"Request model for adding a new topic."},"NoAcademicEmailData":{"properties":{"message":{"type":"string","maxLength":2000,"minLength":1,"title":"Message"}},"type":"object","required":["message"],"title":"NoAcademicEmailData"},"NoteCreate":{"properties":{"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"}},"type":"object","required":["title","content"],"title":"NoteCreate"},"NoteResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"timestamp":{"type":"string","title":"Timestamp"}},"type":"object","required":["id","title","content","topic","timestamp"],"title":"NoteResponse"},"NotificationPayload":{"properties":{"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"user_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"User Ids"},"tokens":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tokens"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"badge":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Badge"}},"type":"object","required":["title","body"],"title":"NotificationPayload","description":"Model for sending a notification to users"},"NotificationPermissionStatus":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"}},"type":"object","title":"NotificationPermissionStatus","description":"Model for user notification permission status"},"NotificationPreferenceData":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"NotificationPreferenceData"},"NotificationPreferences":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"NotificationPreferences","description":"Model for user notification preferences"},"NotifyEligibleRequest":{"properties":{"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group"},"dry_run":{"type":"boolean","title":"Dry Run","default":true}},"type":"object","required":["title","body"],"title":"NotifyEligibleRequest"},"NotifyEligibleResponse":{"properties":{"dry_run":{"type":"boolean","title":"Dry Run"},"eligible":{"type":"integer","title":"Eligible","description":"Eligible students in the chosen group(s)"},"already_notified":{"type":"integer","title":"Already Notified","description":"Eligible students already notified for this campaign"},"with_device":{"type":"integer","title":"With Device","description":"Remaining recipients that have at least one device token"},"sent":{"type":"integer","title":"Sent","default":0},"failed":{"type":"integer","title":"Failed","default":0}},"type":"object","required":["dry_run","eligible","already_notified","with_device"],"title":"NotifyEligibleResponse"},"OnboardingStatusResponse":{"properties":{"completed_us_onboarding":{"type":"boolean","title":"Completed Us Onboarding"}},"type":"object","required":["completed_us_onboarding"],"title":"OnboardingStatusResponse"},"OnboardingStepData":{"properties":{"step":{"type":"string","title":"Step"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"math_confidence":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Math Confidence"},"current_results_slider_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Results Slider Value"},"current_results_perception":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Results Perception"},"motivation_level_slider_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Motivation Level Slider Value"},"interests_main":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Interests Main"},"interests_sub_choices":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Interests Sub Choices"},"motivation_reasons":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Motivation Reasons"},"study_hours_daily_goal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Study Hours Daily Goal"},"notification_preference_choice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Preference Choice"},"class_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Code"},"pending_student_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Student Id"},"establishment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Establishment"},"subject":{"anyOf":[{"type":"string","enum":["maths","physique-chimie"]},{"type":"null"}],"title":"Subject"},"taught_levels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Taught Levels"},"objectives":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Objectives"},"discovery_sources":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Discovery Sources"},"discovery_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discovery Source"},"is_custom_school":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Custom School"},"custom_school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom School Name"},"custom_school_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom School City"},"french_school_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"French School Id"},"french_school_uai":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"French School Uai"},"has_limited_access":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Limited Access"},"device_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Type"},"onboarding_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding Session Id"}},"type":"object","required":["step"],"title":"OnboardingStepData","description":"Flexible model for updating onboarding data progressively.\nEach step can send only the relevant fields."},"OpenAnswerStatusResponse":{"properties":{"question_id":{"type":"string","title":"Question Id"},"grading_status":{"type":"string","title":"Grading Status"},"points_earned":{"type":"number","title":"Points Earned","default":0.0},"points_max":{"type":"number","title":"Points Max","default":1.0},"is_correct":{"type":"boolean","title":"Is Correct","default":false},"photo_urls":{"items":{"type":"string"},"type":"array","title":"Photo Urls"},"grading_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grading Error"},"rubric_evaluation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rubric Evaluation"},"statement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statement"},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer"},"criteria":{"items":{"type":"string"},"type":"array","title":"Criteria"}},"type":"object","required":["question_id","grading_status"],"title":"OpenAnswerStatusResponse","description":"Grading state of an open answer (polled by the frontend)."},"OriginalSourceInfo":{"properties":{"figure_id":{"type":"string","title":"Figure Id"},"source_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"},"exercise_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Session Id"},"teacher_exam_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Exam Id"}},"type":"object","required":["figure_id"],"title":"OriginalSourceInfo","description":"Info about the original source figure (for reprompts)."},"OverallProductAdoptionMetrics":{"properties":{"total_schools":{"type":"integer","title":"Total Schools"},"active_schools":{"type":"integer","title":"Active Schools"},"school_active_rate":{"type":"number","title":"School Active Rate"},"total_teachers":{"type":"integer","title":"Total Teachers"},"active_teachers":{"type":"integer","title":"Active Teachers"},"teacher_active_rate":{"type":"number","title":"Teacher Active Rate"},"total_classes":{"type":"integer","title":"Total Classes"},"active_classes":{"type":"integer","title":"Active Classes"},"class_active_rate":{"type":"number","title":"Class Active Rate"},"total_students":{"type":"integer","title":"Total Students"},"active_students":{"type":"integer","title":"Active Students"},"student_active_rate":{"type":"number","title":"Student Active Rate"},"teacher_devoirs_adoption_rate":{"type":"number","title":"Teacher Devoirs Adoption Rate"},"teacher_cours_adoption_rate":{"type":"number","title":"Teacher Cours Adoption Rate"},"teacher_evaluations_adoption_rate":{"type":"number","title":"Teacher Evaluations Adoption Rate"},"student_dm_adoption_rate":{"type":"number","title":"Student Dm Adoption Rate"},"student_exercices_excellence_adoption_rate":{"type":"number","title":"Student Exercices Excellence Adoption Rate"},"student_aide_devoirs_adoption_rate":{"type":"number","title":"Student Aide Devoirs Adoption Rate"},"student_coach_examen_adoption_rate":{"type":"number","title":"Student Coach Examen Adoption Rate"},"student_cours_adoption_rate":{"type":"number","title":"Student Cours Adoption Rate"}},"type":"object","required":["total_schools","active_schools","school_active_rate","total_teachers","active_teachers","teacher_active_rate","total_classes","active_classes","class_active_rate","total_students","active_students","student_active_rate","teacher_devoirs_adoption_rate","teacher_cours_adoption_rate","teacher_evaluations_adoption_rate","student_dm_adoption_rate","student_exercices_excellence_adoption_rate","student_aide_devoirs_adoption_rate","student_coach_examen_adoption_rate","student_cours_adoption_rate"],"title":"OverallProductAdoptionMetrics"},"OverrideExerciseAttemptPayload":{"properties":{"sub_chapitre_id":{"type":"string","title":"Sub Chapitre Id"},"holiday_course_exercise_id":{"type":"string","title":"Holiday Course Exercise Id"},"override_reason":{"type":"string","enum":["transcription_error","alternative_correct_method","solution_is_wrong","other"],"title":"Override Reason"},"override_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Notes"}},"type":"object","required":["sub_chapitre_id","holiday_course_exercise_id","override_reason"],"title":"OverrideExerciseAttemptPayload","description":"Payload for overriding holiday exercise attempt status."},"PDFOptionsUpdate":{"properties":{"teacher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Name"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"school_logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Logo Url"},"class_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Name"},"title_override":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title Override"},"duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duration"},"general_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"General Instructions"},"template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template"},"font_family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Font Family"},"font_size":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Font Size"},"line_spacing":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Line Spacing"},"include_header":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Header"},"auto_save_preferences":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Save Preferences","default":true}},"type":"object","title":"PDFOptionsUpdate"},"PDFUploadResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"}},"type":"object","required":["status","message","image_urls"],"title":"PDFUploadResponse"},"PageAssignment":{"properties":{"student_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Id"},"student_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Name"},"page_indices":{"items":{"type":"integer"},"type":"array","title":"Page Indices"}},"type":"object","required":["page_indices"],"title":"PageAssignment"},"PageVisitRequest":{"properties":{"page_key":{"type":"string","title":"Page Key"}},"type":"object","required":["page_key"],"title":"PageVisitRequest"},"PageVisitResponse":{"properties":{"is_first_visit":{"type":"boolean","title":"Is First Visit"}},"type":"object","required":["is_first_visit"],"title":"PageVisitResponse"},"PaginatedModificationList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CorrectionModificationListItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["items","total","page","limit","has_more"],"title":"PaginatedModificationList"},"ParametersOut":{"properties":{"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade"},"filiere":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filiere"},"teacher_type":{"anyOf":[{"type":"string","enum":["lycée","prepa"]},{"type":"null"}],"title":"Teacher Type"},"subject":{"anyOf":[{"type":"string","enum":["maths","physique-chimie"]},{"type":"null"}],"title":"Subject"},"has_limited_access":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Limited Access"},"beta_features_enabled":{"type":"boolean","title":"Beta Features Enabled","default":false}},"type":"object","required":["email"],"title":"ParametersOut","description":"The data returned when fetching the user's parameters."},"ParametersUpdateIn":{"properties":{"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"role":{"anyOf":[{"type":"string","enum":["student","cpge_user"]},{"type":"null"}],"title":"Role","description":"User can change between student and cpge_user roles"},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade","description":"Student level / classe (e.g. 3eme, 2nde, Terminale, CPGE_Sup)"},"filiere":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filiere","description":"CPGE track (Sup, MP, PC, PSI, ECG, sup_ecg_math_appliques, sup_ecg_math_approfondi) — only for cpge users"},"teacher_type":{"anyOf":[{"type":"string","enum":["lycée","prepa"]},{"type":"null"}],"title":"Teacher Type","description":"Teacher type (only for teachers)"},"subject":{"anyOf":[{"type":"string","enum":["maths","physique-chimie"]},{"type":"null"}],"title":"Subject","description":"Matière taught (only for teachers)"},"beta_features_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Beta Features Enabled","description":"Enable early-access and beta product features"}},"type":"object","title":"ParametersUpdateIn","description":"Fields that can be updated by the user."},"ParsedStudentResponse":{"properties":{"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"status":{"type":"string","title":"Status"}},"type":"object","required":["first_name","last_name","status"],"title":"ParsedStudentResponse"},"PdfDownloadStatsResponse":{"properties":{"total_downloads":{"type":"integer","title":"Total Downloads"},"success_count":{"type":"integer","title":"Success Count"},"auto_repaired_count":{"type":"integer","title":"Auto Repaired Count"},"failed_count":{"type":"integer","title":"Failed Count"}},"type":"object","required":["total_downloads","success_count","auto_repaired_count","failed_count"],"title":"PdfDownloadStatsResponse"},"PdfFailureContext":{"properties":{"source":{"type":"string","title":"Source"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"}},"type":"object","required":["source"],"title":"PdfFailureContext"},"PdfFailureDetailResponse":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","enum":["new","in-progress","done"],"title":"Status"},"occurrence_count":{"type":"integer","title":"Occurrence Count"},"first_seen_at":{"type":"string","format":"date-time","title":"First Seen At"},"last_seen_at":{"type":"string","format":"date-time","title":"Last Seen At"},"reporters":{"items":{"$ref":"#/components/schemas/PdfFailureReporter"},"type":"array","title":"Reporters"},"contexts":{"items":{"$ref":"#/components/schemas/PdfFailureContext"},"type":"array","title":"Contexts"},"suspect_htmls":{"items":{"$ref":"#/components/schemas/PdfFailureSuspect"},"type":"array","title":"Suspect Htmls"},"last_error":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Last Error"},"conversion_status":{"anyOf":[{},{"type":"null"}],"title":"Conversion Status"},"replies":{"items":{"$ref":"#/components/schemas/PdfFailureReply"},"type":"array","title":"Replies"},"last_status_changed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status Changed By"},"last_status_changed_by_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status Changed By Name"},"status_changed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Status Changed At"},"affected_reporters":{"items":{"$ref":"#/components/schemas/PdfFailureReporter"},"type":"array","title":"Affected Reporters"}},"type":"object","required":["id","status","occurrence_count","first_seen_at","last_seen_at","reporters","contexts","suspect_htmls","replies"],"title":"PdfFailureDetailResponse"},"PdfFailureListItem":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","enum":["new","in-progress","done"],"title":"Status"},"occurrence_count":{"type":"integer","title":"Occurrence Count"},"source":{"type":"string","title":"Source"},"first_seen_at":{"type":"string","format":"date-time","title":"First Seen At"},"last_seen_at":{"type":"string","format":"date-time","title":"Last Seen At"},"html_preview":{"type":"string","title":"Html Preview"},"latest_user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest User Email"},"latest_user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest User Name"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"conversion_status":{"anyOf":[{},{"type":"null"}],"title":"Conversion Status"},"suspect_count":{"type":"integer","title":"Suspect Count"},"affected_user_count":{"type":"integer","title":"Affected User Count","default":0},"download_outcome":{"type":"string","enum":["success","auto_repaired","failed"],"title":"Download Outcome","default":"failed"}},"type":"object","required":["id","status","occurrence_count","source","first_seen_at","last_seen_at","html_preview","suspect_count"],"title":"PdfFailureListItem"},"PdfFailureListResponse":{"properties":{"failures":{"items":{"$ref":"#/components/schemas/PdfFailureListItem"},"type":"array","title":"Failures"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["failures","total"],"title":"PdfFailureListResponse"},"PdfFailureReply":{"properties":{"message":{"type":"string","title":"Message"},"admin_id":{"type":"string","title":"Admin Id"},"admin_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Name"},"sent_at":{"type":"string","format":"date-time","title":"Sent At"},"sent_to_email":{"type":"string","title":"Sent To Email"}},"type":"object","required":["message","admin_id","sent_to_email"],"title":"PdfFailureReply"},"PdfFailureReporter":{"properties":{"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Name"},"user_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Role"},"reported_at":{"type":"string","format":"date-time","title":"Reported At"}},"type":"object","title":"PdfFailureReporter"},"PdfFailureSuspect":{"properties":{"html_hash":{"type":"string","title":"Html Hash"},"html_content":{"type":"string","title":"Html Content"},"source":{"type":"string","title":"Source"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"conversion_status":{"anyOf":[{},{"type":"null"}],"title":"Conversion Status"}},"type":"object","required":["html_hash","html_content","source"],"title":"PdfFailureSuspect"},"PdfRequest":{"properties":{"html":{"type":"string","title":"Html"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","required":["html"],"title":"PdfRequest"},"PendingAcquisition":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exam_id":{"type":"string","title":"Exam Id"},"exam_title":{"type":"string","title":"Exam Title"},"teacher_id":{"type":"string","title":"Teacher Id"},"teacher_name":{"type":"string","title":"Teacher Name"},"photo_count":{"type":"integer","title":"Photo Count"},"student_submission_available_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Student Submission Available At"}},"type":"object","required":["session_id","exam_id","exam_title","teacher_id","teacher_name","photo_count"],"title":"PendingAcquisition"},"PendingStudentInfo":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"}},"type":"object","required":["id","name","first_name","last_name"],"title":"PendingStudentInfo"},"PhotoBBox":{"properties":{"photo_index":{"type":"integer","title":"Photo Index"},"x":{"type":"number","title":"X"},"y":{"type":"number","title":"Y"},"width":{"type":"number","title":"Width"},"height":{"type":"number","title":"Height"}},"type":"object","required":["photo_index","x","y","width","height"],"title":"PhotoBBox","description":"A rectangular region on one of the submission photos. Coordinates are\nnormalized 0..1 relative to that photo's own dimensions. `photo_index` is\n0-based into `SubmissionAttempt.submission_photo_urls`."},"PhotoDispatchResultResponse":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"photo_indices":{"items":{"type":"integer"},"type":"array","title":"Photo Indices"},"attempt_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Attempt Index"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["exercise_id","photo_indices","attempt_index","error"],"title":"PhotoDispatchResultResponse"},"PhotoSubmissionCreate":{"properties":{"photo_urls":{"items":{"type":"string"},"type":"array","maxItems":12,"minItems":1,"title":"Photo Urls"},"include_transcription":{"type":"boolean","title":"Include Transcription","default":false},"device_type":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Device Type"}},"type":"object","required":["photo_urls"],"title":"PhotoSubmissionCreate","description":"Per-exercise photo submission. `include_transcription` selects the V3\nprompt variant (grading + read-only transcription of the copy)."},"PhotoSubmissionResponse":{"properties":{"attempt_index":{"type":"integer","title":"Attempt Index"},"grading_status":{"type":"string","const":"processing","title":"Grading Status"}},"type":"object","required":["attempt_index","grading_status"],"title":"PhotoSubmissionResponse"},"PhotoSubmissionStatusesResponse":{"properties":{"statuses":{"items":{"$ref":"#/components/schemas/ExercisePhotoStatusResponse"},"type":"array","title":"Statuses"}},"type":"object","required":["statuses"],"title":"PhotoSubmissionStatusesResponse"},"PhysicsLibraryMetricsSummary":{"properties":{"high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High Rating Rate"},"average_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Rating"},"ratings_count":{"type":"integer","title":"Ratings Count"},"ratings_with_category":{"type":"integer","title":"Ratings With Category","default":0},"category_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Category Breakdown"},"surface_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Surface Breakdown"},"action_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Action Breakdown"},"rating_distribution":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Rating Distribution"}},"type":"object","required":["high_rating_rate","average_rating","ratings_count"],"title":"PhysicsLibraryMetricsSummary"},"PhysicsLibraryReviewItem":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"device_type":{"type":"string","title":"Device Type"},"rating":{"type":"integer","title":"Rating"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"prompt_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prompt Index"},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"},"action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"},"selection_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selection Count"},"question":{"type":"string","title":"Question","default":"Qu’avez-vous pensé de la bibliothèque Excellence ?"}},"type":"object","required":["id","created_at","device_type","rating"],"title":"PhysicsLibraryReviewItem"},"PresenceStatus":{"properties":{"student_id":{"type":"string","title":"Student Id"},"full_name":{"type":"string","title":"Full Name"},"status":{"type":"string","enum":["green","red"],"title":"Status"}},"type":"object","required":["student_id","full_name","status"],"title":"PresenceStatus","description":"Model representing the presence status of a student.\nReturns both the student's ID and full name."},"ProcessImagesRequest":{"properties":{"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"previous_transcription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Transcription"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"lang":{"type":"string","title":"Lang","default":"en"}},"type":"object","required":["image_urls"],"title":"ProcessImagesRequest"},"ProcessImagesResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"extracted_text":{"type":"string","title":"Extracted Text"}},"type":"object","required":["status","message","image_urls","extracted_text"],"title":"ProcessImagesResponse"},"ProcessedExercise":{"properties":{"statement":{"type":"string","title":"Statement"},"difficulty":{"type":"string","enum":["easy","medium","hard"],"title":"Difficulty"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"solution":{"type":"string","title":"Solution"},"hints1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints1"},"hints2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints2"},"hints3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hints3"},"created_exercise_id":{"type":"string","title":"Created Exercise Id"}},"type":"object","required":["statement","difficulty","solution","created_exercise_id"],"title":"ProcessedExercise","description":"Model for an exercise that has been fully processed with solutions and hints"},"ProductAdoptionResponse":{"properties":{"weeks_analyzed":{"type":"integer","title":"Weeks Analyzed"},"analysis_start_date":{"type":"string","format":"date-time","title":"Analysis Start Date"},"analysis_end_date":{"type":"string","format":"date-time","title":"Analysis End Date"},"overall":{"$ref":"#/components/schemas/OverallProductAdoptionMetrics"},"schools":{"items":{"$ref":"#/components/schemas/SchoolProductAdoptionItem"},"type":"array","title":"Schools"}},"type":"object","required":["weeks_analyzed","analysis_start_date","analysis_end_date","overall","schools"],"title":"ProductAdoptionResponse"},"Programme":{"properties":{"id":{"type":"string","title":"Id"},"grade_key":{"type":"string","title":"Grade Key"},"grade_display":{"type":"string","title":"Grade Display"},"subject":{"type":"string","title":"Subject","default":"maths"},"disabled":{"type":"boolean","title":"Disabled","default":false},"sort_order":{"type":"integer","title":"Sort Order","default":0},"chapters":{"items":{"$ref":"#/components/schemas/Chapter"},"type":"array","title":"Chapters"},"teacher_types":{"items":{"type":"string"},"type":"array","title":"Teacher Types"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","grade_key","grade_display"],"title":"Programme"},"ProgrammeCreateInput":{"properties":{"grade_key":{"type":"string","minLength":1,"title":"Grade Key"},"grade_display":{"type":"string","minLength":1,"title":"Grade Display"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"},"disabled":{"type":"boolean","title":"Disabled","default":false},"sort_order":{"type":"integer","title":"Sort Order","default":0},"chapters":{"items":{"$ref":"#/components/schemas/ChapterInput"},"type":"array","title":"Chapters"}},"type":"object","required":["grade_key","grade_display"],"title":"ProgrammeCreateInput"},"ProgrammeUpdateInput":{"properties":{"grade_display":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade Display"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disabled"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"},"chapters":{"anyOf":[{"items":{"$ref":"#/components/schemas/ChapterInput"},"type":"array"},{"type":"null"}],"title":"Chapters"},"teacher_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Teacher Types"}},"type":"object","title":"ProgrammeUpdateInput","description":"Partial update — fields omitted are left untouched."},"ProgressionSummary":{"properties":{"total_homework_exercises":{"type":"integer","title":"Total Homework Exercises"},"total_exercise_sessions":{"type":"integer","title":"Total Exercise Sessions"},"total_custom_courses":{"type":"integer","title":"Total Custom Courses"},"total_student_exams":{"type":"integer","title":"Total Student Exams"},"exam_performance":{"anyOf":[{"$ref":"#/components/schemas/ExamPerformance"},{"type":"null"}]},"latest_activities":{"items":{"$ref":"#/components/schemas/Activity"},"type":"array","title":"Latest Activities","default":[]},"timeseries":{"items":{"$ref":"#/components/schemas/TimeSeriesData"},"type":"array","title":"Timeseries","default":[]},"total_chat_messages":{"type":"integer","title":"Total Chat Messages","default":0}},"type":"object","required":["total_homework_exercises","total_exercise_sessions","total_custom_courses","total_student_exams"],"title":"ProgressionSummary"},"ProposedChanges":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"variations":{"items":{"$ref":"#/components/schemas/VariationChange"},"type":"array","title":"Variations"}},"type":"object","title":"ProposedChanges","description":"Proposed changes from AI review"},"PublicExerciseCreate":{"properties":{"content":{"type":"string","title":"Content"},"solution":{"type":"string","title":"Solution"},"figure_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Solution"},"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"library":{"type":"string","enum":["excellence","cpge","remediation"],"title":"Library","default":"excellence"},"type":{"type":"string","enum":["exercice","automatisme","application_du_cours"],"title":"Type","default":"exercice"},"cpge":{"anyOf":[{"$ref":"#/components/schemas/CpgeMetadata-Input"},{"type":"null"}]},"savoirs_faire_ids":{"items":{"type":"string"},"type":"array","title":"Savoirs Faire Ids"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","required":["content","solution"],"title":"PublicExerciseCreate"},"PublicExerciseDetail":{"properties":{"id":{"type":"string","title":"Id"},"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"content":{"type":"string","title":"Content"},"solution":{"type":"string","title":"Solution"},"figure_content":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Figure Solution"},"themes":{"items":{"type":"string"},"type":"array","title":"Themes"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"library":{"type":"string","enum":["excellence","cpge","remediation"],"title":"Library","default":"excellence"},"type":{"type":"string","enum":["exercice","automatisme","application_du_cours"],"title":"Type","default":"exercice"},"cpge":{"anyOf":[{"$ref":"#/components/schemas/routers__admin_public_exercises__CpgeMetadata"},{"type":"null"}]},"likes_count":{"type":"integer","title":"Likes Count","default":0},"savoirs_faire_ids":{"items":{"type":"string"},"type":"array","title":"Savoirs Faire Ids"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","required":["id","category_path","content","solution"],"title":"PublicExerciseDetail","description":"Full detail used by the edit panel."},"PublicExerciseFlagCreate":{"properties":{"report_type":{"type":"string","enum":["bad_formatting","wrong_solution","unclear_explanation","other"],"title":"Report Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["report_type"],"title":"PublicExerciseFlagCreate"},"PublicExerciseFlagOut":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"report_type":{"type":"string","title":"Report Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"exercise_type":{"type":"string","title":"Exercise Type","default":"public"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"status":{"type":"string","title":"Status"},"reviewed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewed By"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"}},"type":"object","required":["id","user_id","exercise_id","report_type","created_at","status"],"title":"PublicExerciseFlagOut"},"PublicExerciseOut":{"properties":{"id":{"type":"string","title":"Id"},"themes":{"items":{"type":"string"},"type":"array","title":"Themes"},"content":{"type":"string","title":"Content"},"solution":{"type":"string","title":"Solution"},"figure_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Solution"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"sequence_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sequence Number"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"},"diagnostic_info":{"anyOf":[{"$ref":"#/components/schemas/DiagnosticInfoOut"},{"type":"null"}]},"library":{"type":"string","enum":["excellence","cpge","remediation"],"title":"Library","default":"excellence"},"type":{"type":"string","enum":["exercice","automatisme","application_du_cours"],"title":"Type","default":"exercice"},"cpge":{"anyOf":[{"$ref":"#/components/schemas/routers__public_exercises__CpgeMetadata"},{"type":"null"}]},"likes_count":{"type":"integer","title":"Likes Count","default":0},"savoirs_faire_ids":{"items":{"type":"string"},"type":"array","title":"Savoirs Faire Ids"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","required":["id","themes","content","solution","created_at","updated_at"],"title":"PublicExerciseOut"},"PublicExerciseUpdate":{"properties":{"content":{"type":"string","title":"Content"},"solution":{"type":"string","title":"Solution"},"figure_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Solution"},"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"library":{"type":"string","enum":["excellence","cpge","remediation"],"title":"Library","default":"excellence"},"type":{"type":"string","enum":["exercice","automatisme","application_du_cours"],"title":"Type","default":"exercice"},"cpge":{"anyOf":[{"$ref":"#/components/schemas/CpgeMetadata-Input"},{"type":"null"}]},"savoirs_faire_ids":{"items":{"type":"string"},"type":"array","title":"Savoirs Faire Ids"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","required":["content","solution"],"title":"PublicExerciseUpdate"},"PublishResultsRequest":{"properties":{"hide_grades":{"type":"boolean","title":"Hide Grades","default":false}},"type":"object","title":"PublishResultsRequest"},"QCM":{"properties":{"_id":{"type":"string","title":"Id"},"course_id":{"type":"string","title":"Course Id"},"unit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Id"},"user_id":{"type":"string","title":"User Id"},"question":{"type":"string","title":"Question"},"options":{"items":{"type":"string"},"type":"array","title":"Options"},"correct_answer_index":{"type":"integer","title":"Correct Answer Index"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["course_id","user_id","question","options","correct_answer_index"],"title":"QCM","description":"Represents a multiple-choice question generated from a course.\nQCM = Questionnaire à Choix Multiples (Multiple Choice Questions)"},"QCMResponse":{"properties":{"id":{"type":"string","title":"Id"},"question":{"type":"string","title":"Question"},"options":{"items":{"type":"string"},"type":"array","title":"Options"},"correct_answer_index":{"type":"integer","title":"Correct Answer Index"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation"},"unit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Id"}},"type":"object","required":["id","question","options","correct_answer_index"],"title":"QCMResponse"},"QuestDefinitionBase":{"properties":{"name":{"type":"string","title":"Name"},"description_template":{"type":"string","title":"Description Template"},"category":{"$ref":"#/components/schemas/BadgeCategory"},"base_target":{"type":"integer","title":"Base Target"},"target_variance_percent":{"type":"number","title":"Target Variance Percent"},"xp_reward":{"type":"integer","title":"Xp Reward"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name","description_template","category","base_target","target_variance_percent","xp_reward"],"title":"QuestDefinitionBase","description":"Base model for quest definitions"},"QuestDefinitionResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description_template":{"type":"string","title":"Description Template"},"category":{"type":"string","title":"Category"},"base_target":{"type":"integer","title":"Base Target"},"target_variance_percent":{"type":"number","title":"Target Variance Percent"},"xp_reward":{"type":"integer","title":"Xp Reward"},"image_url":{"type":"string","title":"Image Url"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","description_template","category","base_target","target_variance_percent","xp_reward","image_url","is_active","created_at","updated_at"],"title":"QuestDefinitionResponse"},"QuestionResponse":{"properties":{"question_id":{"type":"string","title":"Question Id"},"question_type":{"type":"string","title":"Question Type"},"question":{"type":"string","title":"Question"},"options":{"items":{"type":"string"},"type":"array","title":"Options"},"points_max":{"type":"number","title":"Points Max","default":1.0}},"type":"object","required":["question_id","question_type","question","options"],"title":"QuestionResponse","description":"Question response without correct answer (for student view)."},"QuestionWithVariationsResponse":{"properties":{"question_id":{"type":"string","title":"Question Id"},"question_type":{"type":"string","title":"Question Type"},"topic":{"type":"string","title":"Topic"},"variations":{"items":{"$ref":"#/components/schemas/VariationResponse"},"type":"array","title":"Variations"}},"type":"object","required":["question_id","question_type","topic","variations"],"title":"QuestionWithVariationsResponse","description":"Question with all variations (for teacher view)."},"QuestionZone":{"properties":{"question_indexes":{"items":{"type":"integer"},"type":"array","title":"Question Indexes"},"boxes":{"items":{"$ref":"#/components/schemas/PhotoBBox"},"type":"array","title":"Boxes"}},"type":"object","required":["question_indexes","boxes"],"title":"QuestionZone","description":"Where on the submission photos the work for a group of rubric questions\nsits. The grader emits few zones — consecutive small sub-questions answered\nin the same region share one zone — so the annotated photo stays readable\ninstead of carrying one box per criterion. `question_indexes` are 0-based\npositions into `RubricEvaluation.questions` (rubric question order); a\nquestion missing from every zone simply has no anchor on the photos."},"QuickCreateRequirementRequest":{"properties":{"prompt_text":{"type":"string","maxLength":2000,"minLength":1,"title":"Prompt Text"},"active_grades":{"items":{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},"type":"array","title":"Active Grades"}},"type":"object","required":["prompt_text"],"title":"QuickCreateRequirementRequest"},"QuizAnalyticsResponse":{"properties":{"total_students":{"type":"integer","title":"Total Students"},"students_started":{"type":"integer","title":"Students Started"},"students_completed":{"type":"integer","title":"Students Completed"},"average_score":{"type":"number","title":"Average Score"},"highest_score":{"type":"number","title":"Highest Score"},"lowest_score":{"type":"number","title":"Lowest Score"},"students":{"items":{"$ref":"#/components/schemas/StudentQuizResult"},"type":"array","title":"Students"}},"type":"object","required":["total_students","students_started","students_completed","average_score","highest_score","lowest_score","students"],"title":"QuizAnalyticsResponse","description":"Analytics for a course quiz."},"QuizAnswerRecord":{"properties":{"question_id":{"type":"string","title":"Question Id"},"answer_type":{"type":"string","enum":["choice","open"],"title":"Answer Type","default":"choice"},"selected_answer_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selected Answer Index"},"is_correct":{"type":"boolean","title":"Is Correct","default":false},"photo_urls":{"items":{"type":"string"},"type":"array","title":"Photo Urls"},"grading_status":{"anyOf":[{"type":"string","enum":["processing","graded","error","rejected"]},{"type":"null"}],"title":"Grading Status"},"grading_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grading Error"},"rubric_evaluation":{"anyOf":[{"$ref":"#/components/schemas/RubricEvaluation"},{"type":"null"}]},"points_earned":{"type":"number","title":"Points Earned","default":0.0},"points_max":{"type":"number","title":"Points Max","default":1.0}},"type":"object","required":["question_id"],"title":"QuizAnswerRecord","description":"Record of a student's answer to a single quiz question.\n\nChoice answers (qcm / true_false) are checked synchronously and carry\n`selected_answer_index`. Open answers carry the student's photos and are\ngraded asynchronously against the variation's criteria by the multimodal\ngrading inference — `rubric_evaluation` lands once `grading_status`\nreaches \"graded\"."},"QuizHistoryResponse":{"properties":{"attempts":{"items":{"$ref":"#/components/schemas/AttemptResponse"},"type":"array","title":"Attempts"},"best_score":{"type":"number","title":"Best Score"},"attempts_count":{"type":"integer","title":"Attempts Count"},"max_attempts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Attempts"},"can_retry":{"type":"boolean","title":"Can Retry"}},"type":"object","required":["attempts","best_score","attempts_count","can_retry"],"title":"QuizHistoryResponse","description":"Response for quiz attempt history."},"QuizResponse":{"properties":{"id":{"type":"string","title":"Id"},"course_id":{"type":"string","title":"Course Id"},"questions":{"items":{"$ref":"#/components/schemas/QuestionResponse"},"type":"array","title":"Questions"},"total_questions":{"type":"integer","title":"Total Questions"}},"type":"object","required":["id","course_id","questions","total_questions"],"title":"QuizResponse","description":"Response for getting a quiz (student view)."},"QuizWithVariationsResponse":{"properties":{"id":{"type":"string","title":"Id"},"course_id":{"type":"string","title":"Course Id"},"questions":{"items":{"$ref":"#/components/schemas/QuestionWithVariationsResponse"},"type":"array","title":"Questions"},"total_questions":{"type":"integer","title":"Total Questions"}},"type":"object","required":["id","course_id","questions","total_questions"],"title":"QuizWithVariationsResponse","description":"Response for getting a quiz with all variations (teacher view)."},"RandomHtmlResponse":{"properties":{"html":{"type":"string","title":"Html"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"source":{"type":"string","enum":["teacher_exam","public_exercise"],"title":"Source"},"exam_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exam Id"},"exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Id"}},"type":"object","required":["html","source"],"title":"RandomHtmlResponse"},"RecentActivity":{"properties":{"activity_type":{"type":"string","title":"Activity Type"},"activity_name":{"type":"string","title":"Activity Name"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["activity_type","activity_name","timestamp"],"title":"RecentActivity","description":"Recent activity item for the dashboard."},"RecentActivityResponse":{"properties":{"activity_id":{"type":"string","title":"Activity Id"},"activity_type":{"type":"string","enum":["evaluation","devoir","cours","controle"],"title":"Activity Type"},"title":{"type":"string","title":"Title"},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At"},"target_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Id"},"class_average":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Class Average"},"reference_average":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Reference Average"},"trend":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trend"},"completed_count":{"type":"integer","title":"Completed Count"},"total_students":{"type":"integer","title":"Total Students"}},"type":"object","required":["activity_id","activity_type","title","occurred_at","completed_count","total_students"],"title":"RecentActivityResponse","description":"One card in the activity strip.\n\n`class_average` and `trend` are both null for a `cours`, which is assigned\nand completed but never graded — the card shows `completed_count` instead.\n`trend` is also null for the first graded activity of the year, which has\nno baseline behind it."},"RecentAssignmentsResponse":{"properties":{"assignments":{"items":{"$ref":"#/components/schemas/AssignmentSummary"},"type":"array","title":"Assignments"},"students":{"items":{"$ref":"#/components/schemas/StudentRecentPerformance"},"type":"array","title":"Students"}},"type":"object","required":["assignments","students"],"title":"RecentAssignmentsResponse"},"RecommendedExerciseOut":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title","default":""},"content":{"type":"string","title":"Content","default":""},"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path"},"chapter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chapter"},"difficulty":{"type":"string","title":"Difficulty","default":"medium"},"estimated_minutes":{"type":"integer","title":"Estimated Minutes","default":5}},"type":"object","required":["id"],"title":"RecommendedExerciseOut","description":"Student-facing exercise payload — deliberately NO solution field."},"RecommendedSessionOut":{"properties":{"id":{"type":"string","title":"Id"},"kind":{"type":"string","enum":["resume","consolidate","stretch"],"title":"Kind"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject"},"recent_chapter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recent Chapter"},"exercises":{"items":{"$ref":"#/components/schemas/RecommendedExerciseOut"},"type":"array","title":"Exercises"}},"type":"object","required":["id","kind","subject","exercises"],"title":"RecommendedSessionOut","description":"One recommended session card.\n\n`kind` is the bucket it came from (resume / consolidate / stretch) and\n`subject` the matière of its exercises — the unified landing shows both\nmatières side by side, each card labelled."},"RecomputeResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"}},"type":"object","required":["status","message"],"title":"RecomputeResponse","description":"Response model for POST /admin/exercise-stats/recompute."},"RecorrectionPreviewResponse":{"properties":{"assignment_title":{"type":"string","title":"Assignment Title"},"total_submissions":{"type":"integer","title":"Total Submissions"},"results":{"items":{"$ref":"#/components/schemas/RecorrectionResult"},"type":"array","title":"Results"}},"type":"object","required":["assignment_title","total_submissions","results"],"title":"RecorrectionPreviewResponse"},"RecorrectionResult":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"student_name":{"type":"string","title":"Student Name"},"student_email":{"type":"string","title":"Student Email"},"old_correctness":{"type":"string","title":"Old Correctness"},"old_feedback":{"type":"string","title":"Old Feedback"},"new_correctness":{"type":"string","title":"New Correctness"},"new_feedback":{"type":"string","title":"New Feedback"},"changed":{"type":"boolean","title":"Changed"}},"type":"object","required":["session_id","exercise_id","student_name","student_email","old_correctness","old_feedback","new_correctness","new_feedback","changed"],"title":"RecorrectionResult"},"RecorrectionScopeItem":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Id"}},"type":"object","required":["session_id"],"title":"RecorrectionScopeItem"},"RecoverEmailRequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"RecoverEmailRequest"},"RecoverEmailResponse":{"properties":{"email":{"type":"string","title":"Email"},"message":{"type":"string","title":"Message"}},"type":"object","required":["email","message"],"title":"RecoverEmailResponse"},"ReferralLinkResponse":{"properties":{"referral_link":{"type":"string","title":"Referral Link"}},"type":"object","required":["referral_link"],"title":"ReferralLinkResponse"},"ReferralSummary":{"properties":{"referred_email":{"type":"string","format":"email","title":"Referred Email"},"status":{"type":"string","enum":["pending","done"],"title":"Status"}},"type":"object","required":["referred_email","status"],"title":"ReferralSummary"},"RefineTranscriptionRequest":{"properties":{"old_transcription":{"type":"string","title":"Old Transcription"},"faulty_lines":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Faulty Lines"},"user_feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Feedback"},"lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang","default":"en"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","default":"placeholder.com"}},"type":"object","required":["old_transcription"],"title":"RefineTranscriptionRequest","description":"Data the frontend sends when refining a transcription:\n  - old_transcription: the entire existing transcription\n  - faulty_lines: array of lines identified as incorrect\n  - user_feedback: what the user says is wrong or needs changing\n  - lang: language code, e.g. \"en\""},"RefineTranscriptionResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"refined_text":{"type":"string","title":"Refined Text"}},"type":"object","required":["status","message","refined_text"],"title":"RefineTranscriptionResponse","description":"The response after refinement:\n  - status: e.g. \"success\"\n  - message: any message\n  - refined_text: the new transcription after the fix"},"ReformatResponse":{"properties":{"reformatted_text":{"type":"string","title":"Reformatted Text"}},"type":"object","required":["reformatted_text"],"title":"ReformatResponse"},"RegenerateUnitRequest":{"properties":{"regeneration_type":{"type":"string","enum":["examples","visual","rigorous","beginner","custom"],"title":"Regeneration Type"},"custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Instructions"}},"type":"object","required":["regeneration_type"],"title":"RegenerateUnitRequest"},"RegistrationResponse":{"properties":{"message":{"type":"string","title":"Message"},"success":{"type":"boolean","title":"Success"},"already_registered":{"type":"boolean","title":"Already Registered","default":false}},"type":"object","required":["message","success"],"title":"RegistrationResponse","description":"Response model for webinar registration"},"ReleaseUpdateCreate":{"properties":{"version":{"type":"string","title":"Version","description":"Version number (e.g., '1.2.3')"},"title":{"type":"string","title":"Title","description":"Title of the release update"},"release_date":{"type":"string","format":"date-time","title":"Release Date","description":"Date of the release"},"description":{"type":"string","title":"Description","description":"Description in markdown format"},"target_role":{"type":"string","enum":["teacher","student"],"title":"Target Role","description":"Audience for this release update","default":"teacher"},"is_published":{"type":"boolean","title":"Is Published","description":"Whether the update is published","default":true}},"type":"object","required":["version","title","release_date","description"],"title":"ReleaseUpdateCreate"},"ReleaseUpdateLikeOut":{"properties":{"liked":{"type":"boolean","title":"Liked"},"likes_count":{"type":"integer","title":"Likes Count"}},"type":"object","required":["liked","likes_count"],"title":"ReleaseUpdateLikeOut"},"ReleaseUpdateOut":{"properties":{"id":{"type":"string","title":"Id"},"version":{"type":"string","title":"Version"},"title":{"type":"string","title":"Title"},"release_date":{"type":"string","format":"date-time","title":"Release Date"},"description":{"type":"string","title":"Description"},"target_role":{"type":"string","enum":["teacher","student"],"title":"Target Role","default":"teacher"},"is_published":{"type":"boolean","title":"Is Published"},"likes_count":{"type":"integer","title":"Likes Count","default":0},"liked_by_current_user":{"type":"boolean","title":"Liked By Current User","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"created_by":{"type":"string","title":"Created By"}},"type":"object","required":["id","version","title","release_date","description","is_published","created_at","updated_at","created_by"],"title":"ReleaseUpdateOut"},"ReleaseUpdateUpdate":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"release_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Release Date"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"target_role":{"anyOf":[{"type":"string","enum":["teacher","student"]},{"type":"null"}],"title":"Target Role"},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Published"}},"type":"object","title":"ReleaseUpdateUpdate"},"RemoveStudentBody":{"properties":{"student_id":{"type":"string","title":"Student Id"}},"type":"object","required":["student_id"],"title":"RemoveStudentBody"},"RemoveTeacherResponse":{"properties":{"message":{"type":"string","title":"Message"},"teacher_id":{"type":"string","title":"Teacher Id"},"membership_deactivated":{"type":"boolean","title":"Membership Deactivated"}},"type":"object","required":["message","teacher_id","membership_deactivated"],"title":"RemoveTeacherResponse","description":"Response model for removing teacher from school"},"RenameDatasetRequest":{"properties":{"current_name":{"type":"string","minLength":1,"title":"Current Name"},"new_name":{"type":"string","minLength":1,"title":"New Name"}},"type":"object","required":["current_name","new_name"],"title":"RenameDatasetRequest"},"ReorderExercisesRequest":{"properties":{"exercise_ids":{"items":{"type":"integer"},"type":"array","title":"Exercise Ids"}},"type":"object","required":["exercise_ids"],"title":"ReorderExercisesRequest"},"ReorderPagesBody":{"properties":{"ordered_page_indices":{"items":{"type":"integer"},"type":"array","title":"Ordered Page Indices"}},"type":"object","required":["ordered_page_indices"],"title":"ReorderPagesBody"},"ReorderRequest":{"properties":{"block_ids":{"items":{"type":"string"},"type":"array","title":"Block Ids"}},"type":"object","required":["block_ids"],"title":"ReorderRequest"},"ReorderUnitsRequest":{"properties":{"unit_order":{"items":{"type":"string"},"type":"array","title":"Unit Order","description":"List of unit_ids in the desired order"}},"type":"object","required":["unit_order"],"title":"ReorderUnitsRequest","description":"Request model for reordering course units."},"ReportResponse":{"properties":{"id":{"type":"string","title":"Id"},"copy_correction_id":{"type":"string","title":"Copy Correction Id"},"copy_id":{"type":"string","title":"Copy Id"},"student_id":{"type":"string","title":"Student Id"},"student_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Name"},"exercise_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exercise Id"},"criterion_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Criterion Id"},"reported_comment_text":{"type":"string","title":"Reported Comment Text"},"category":{"type":"string","title":"Category"},"note":{"type":"string","title":"Note"},"status":{"type":"string","title":"Status"},"resolution_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Note"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","copy_correction_id","copy_id","student_id","student_name","exercise_id","criterion_id","reported_comment_text","category","note","status","resolution_note","resolved_at","created_at"],"title":"ReportResponse"},"RepromptExerciseRequest":{"properties":{"new_instructions":{"type":"string","title":"New Instructions"},"exercise":{"additionalProperties":true,"type":"object","title":"Exercise"}},"type":"object","required":["new_instructions","exercise"],"title":"RepromptExerciseRequest"},"RepromptFigureRequest":{"properties":{"instructions":{"type":"string","minLength":1,"title":"Instructions"}},"type":"object","required":["instructions"],"title":"RepromptFigureRequest"},"RepromptSubjectRequest":{"properties":{"new_instructions":{"type":"string","title":"New Instructions"},"exercises":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Exercises"}},"type":"object","required":["new_instructions","exercises"],"title":"RepromptSubjectRequest"},"RequestVerificationData":{"properties":{"academic_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Academic Email"}},"type":"object","title":"RequestVerificationData"},"ResendTeacherWelcomeEmailResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"user_id":{"type":"string","title":"User Id"},"detail":{"type":"string","title":"Detail"}},"type":"object","required":["success","user_id","detail"],"title":"ResendTeacherWelcomeEmailResponse"},"ResetOut":{"properties":{"snapshot_id":{"type":"string","title":"Snapshot Id"},"deleted_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Deleted Counts"},"restored_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Restored Counts"},"date_shift_days":{"type":"number","title":"Date Shift Days"},"reset_at":{"type":"string","format":"date-time","title":"Reset At"}},"type":"object","required":["snapshot_id","deleted_counts","restored_counts","date_shift_days","reset_at"],"title":"ResetOut"},"ResetPasswordConfirm":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","minLength":4,"title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordConfirm"},"ResetPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ResetPasswordRequest"},"ResetRequest":{"properties":{"rebase_dates":{"type":"boolean","title":"Rebase Dates","default":true}},"type":"object","title":"ResetRequest"},"ResetResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"ResetResponse","description":"Response model for the reset endpoint."},"ResolveReportPayload":{"properties":{"status":{"type":"string","title":"Status"},"resolution_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Note"}},"type":"object","required":["status"],"title":"ResolveReportPayload"},"RetentionUsageResponse":{"properties":{"weeks_analyzed":{"type":"integer","title":"Weeks Analyzed"},"analysis_start_date":{"type":"string","format":"date-time","title":"Analysis Start Date"},"analysis_end_date":{"type":"string","format":"date-time","title":"Analysis End Date"},"wat_current":{"type":"integer","title":"Wat Current"},"was_current":{"type":"integer","title":"Was Current"},"teacher_churn_current":{"type":"number","title":"Teacher Churn Current"},"student_churn_current":{"type":"number","title":"Student Churn Current"},"school_churn_current":{"type":"number","title":"School Churn Current"},"teacher_true_churn_current":{"type":"number","title":"Teacher True Churn Current"},"student_true_churn_current":{"type":"number","title":"Student True Churn Current"},"school_true_churn_current":{"type":"number","title":"School True Churn Current"},"contract_renewal_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Contract Renewal Rate"},"weekly_summary":{"items":{"$ref":"#/components/schemas/RetentionWeeklyPoint"},"type":"array","title":"Weekly Summary"},"grr_nrr_by_month":{"items":{"$ref":"#/components/schemas/MonthlyRetentionPoint"},"type":"array","title":"Grr Nrr By Month"}},"type":"object","required":["weeks_analyzed","analysis_start_date","analysis_end_date","wat_current","was_current","teacher_churn_current","student_churn_current","school_churn_current","teacher_true_churn_current","student_true_churn_current","school_true_churn_current","weekly_summary","grr_nrr_by_month"],"title":"RetentionUsageResponse"},"RetentionWeeklyPoint":{"properties":{"week":{"type":"string","title":"Week"},"week_start":{"type":"string","format":"date-time","title":"Week Start"},"week_end":{"type":"string","format":"date-time","title":"Week End"},"wat":{"type":"integer","title":"Wat"},"was":{"type":"integer","title":"Was"},"teacher_churn_rate":{"type":"number","title":"Teacher Churn Rate"},"student_churn_rate":{"type":"number","title":"Student Churn Rate"},"school_churn_rate":{"type":"number","title":"School Churn Rate"},"teacher_true_churn_rate":{"type":"number","title":"Teacher True Churn Rate"},"student_true_churn_rate":{"type":"number","title":"Student True Churn Rate"},"school_true_churn_rate":{"type":"number","title":"School True Churn Rate"}},"type":"object","required":["week","week_start","week_end","wat","was","teacher_churn_rate","student_churn_rate","school_churn_rate","teacher_true_churn_rate","student_true_churn_rate","school_true_churn_rate"],"title":"RetentionWeeklyPoint"},"RetryProcessingRequest":{"properties":{"depth":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Depth"},"include_qcm":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Qcm"},"include_flashcards":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Flashcards"},"include_illustrations":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Illustrations"},"include_excellence_tips":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Excellence Tips"},"custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Instructions"}},"type":"object","title":"RetryProcessingRequest","description":"Request to retry course processing - all fields optional to allow using stored defaults"},"ReviewRequestActionResponse":{"properties":{"status":{"type":"string","title":"Status"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["status"],"title":"ReviewRequestActionResponse"},"ReviewRequestCountResponse":{"properties":{"pending":{"type":"integer","title":"Pending"}},"type":"object","required":["pending"],"title":"ReviewRequestCountResponse"},"ReviewRequestCreate":{"properties":{"category":{"type":"string","enum":["Appréciation trop stricte","Schéma mal interprété","Raisonnement mal compris","Texte mal retranscrit"],"title":"Category"},"note":{"type":"string","maxLength":2000,"minLength":1,"title":"Note"}},"type":"object","required":["category","note"],"title":"ReviewRequestCreate"},"ReviewRequestDetailInfo":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","enum":["pending","resolved","canceled"],"title":"Status"},"original_correctness":{"type":"string","enum":["correct","partial","wrong","not_applicable"],"title":"Original Correctness"},"original_feedback":{"type":"string","title":"Original Feedback"},"student_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Note"},"student_note_category":{"anyOf":[{"type":"string","enum":["Appréciation trop stricte","Schéma mal interprété","Raisonnement mal compris","Texte mal retranscrit"]},{"type":"null"}],"title":"Student Note Category"},"resolution_action":{"anyOf":[{"type":"string","enum":["corrected","marked_partial","dismissed"]},{"type":"null"}],"title":"Resolution Action"},"resolution_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Note"},"resolved_correctness":{"anyOf":[{"type":"string","enum":["correct","partial"]},{"type":"null"}],"title":"Resolved Correctness"},"resolved_feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Feedback"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"}},"type":"object","required":["id","status","original_correctness","original_feedback","created_at","updated_at"],"title":"ReviewRequestDetailInfo"},"ReviewRequestDetailResponse":{"properties":{"request":{"$ref":"#/components/schemas/ReviewRequestDetailInfo"},"exercise":{"$ref":"#/components/schemas/AssignmentExerciseStub"},"submission_attempts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Submission Attempts"},"flagged_attempt_index":{"type":"integer","title":"Flagged Attempt Index"},"flagged_attempt":{"additionalProperties":true,"type":"object","title":"Flagged Attempt"},"flagged_solution_blocks":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Flagged Solution Blocks"},"official_exercise":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Official Exercise"},"session_id":{"type":"string","title":"Session Id"},"student_id":{"type":"string","title":"Student Id"},"student_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Name"}},"type":"object","required":["request","exercise","submission_attempts","flagged_attempt_index","flagged_attempt","flagged_solution_blocks","session_id","student_id"],"title":"ReviewRequestDetailResponse"},"ReviewRequestListItemResponse":{"properties":{"id":{"type":"string","title":"Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"exercise_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exercise Index"},"exercise_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Title"},"student_id":{"type":"string","title":"Student Id"},"student_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Name"},"status":{"type":"string","enum":["pending","resolved","canceled"],"title":"Status"},"original_correctness":{"type":"string","enum":["correct","partial","wrong","not_applicable"],"title":"Original Correctness"},"original_feedback":{"type":"string","title":"Original Feedback"},"student_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Note"},"student_note_category":{"anyOf":[{"type":"string","enum":["Appréciation trop stricte","Schéma mal interprété","Raisonnement mal compris","Texte mal retranscrit"]},{"type":"null"}],"title":"Student Note Category"},"resolution_action":{"anyOf":[{"type":"string","enum":["corrected","marked_partial","dismissed"]},{"type":"null"}],"title":"Resolution Action"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"}},"type":"object","required":["id","exercise_id","student_id","status","original_correctness","original_feedback","created_at","updated_at"],"title":"ReviewRequestListItemResponse"},"ReviewRequestListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ReviewRequestListItemResponse"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ReviewRequestListResponse"},"ReviewRequestResolveRequest":{"properties":{"action":{"type":"string","enum":["correct","partial","dismiss"],"title":"Action"},"new_feedback_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Feedback Text"},"resolution_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Note"}},"type":"object","required":["action"],"title":"ReviewRequestResolveRequest"},"ReviewRequestSummaryItem":{"properties":{"request_id":{"type":"string","title":"Request Id"},"status":{"type":"string","enum":["pending","resolved","canceled"],"title":"Status"},"original_correctness":{"type":"string","enum":["correct","partial","wrong","not_applicable"],"title":"Original Correctness"},"original_feedback":{"type":"string","title":"Original Feedback"},"resolved_correctness":{"anyOf":[{"type":"string","enum":["correct","partial","wrong","not_applicable"]},{"type":"null"}],"title":"Resolved Correctness"},"resolved_feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Feedback"},"resolution_action":{"anyOf":[{"type":"string","enum":["corrected","marked_partial","dismissed"]},{"type":"null"}],"title":"Resolution Action"},"resolution_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Note"},"student_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Note"},"student_note_category":{"anyOf":[{"type":"string","enum":["Appréciation trop stricte","Schéma mal interprété","Raisonnement mal compris","Texte mal retranscrit"]},{"type":"null"}],"title":"Student Note Category"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"}},"type":"object","required":["request_id","status","original_correctness","original_feedback","created_at"],"title":"ReviewRequestSummaryItem"},"ReviewRequestSummaryResponse":{"properties":{"exercises":{"additionalProperties":{"$ref":"#/components/schemas/ReviewRequestSummaryItem"},"type":"object","title":"Exercises"}},"type":"object","title":"ReviewRequestSummaryResponse"},"ReviewStatsOut":{"properties":{"to_hide":{"type":"integer","title":"To Hide","default":0},"to_modify":{"type":"integer","title":"To Modify","default":0},"to_keep":{"type":"integer","title":"To Keep","default":0},"total":{"type":"integer","title":"Total","default":0}},"type":"object","title":"ReviewStatsOut"},"ReviewTagOut":{"properties":{"id":{"type":"string","title":"Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"review_status":{"type":"string","title":"Review Status"},"reviewed_by":{"type":"string","title":"Reviewed By"},"reviewed_at":{"type":"string","format":"date-time","title":"Reviewed At"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["id","exercise_id","review_status","reviewed_by","reviewed_at"],"title":"ReviewTagOut"},"ReworkSkillResponse":{"properties":{"savoir_faire_id":{"type":"string","title":"Savoir Faire Id"},"name":{"type":"string","title":"Name"},"chapter":{"type":"string","title":"Chapter"},"class_mastery":{"type":"number","title":"Class Mastery"},"evaluated_count":{"type":"integer","title":"Evaluated Count"},"struggling_count":{"type":"integer","title":"Struggling Count"},"priority":{"type":"number","title":"Priority"},"cells":{"items":{"$ref":"#/components/schemas/MasteryCellResponse"},"type":"array","title":"Cells"}},"type":"object","required":["savoir_faire_id","name","chapter","class_mastery","evaluated_count","struggling_count","priority","cells"],"title":"ReworkSkillResponse","description":"`struggling_count` of `evaluated_count` is what the row's header\nreads; `priority` ships so a surprising order can be explained rather\nthan argued about."},"RewriteUnitRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"Instructions for how to rewrite the unit"},"preserve_flashcards":{"type":"boolean","title":"Preserve Flashcards","description":"Whether to preserve existing flashcards","default":true},"preserve_qcms":{"type":"boolean","title":"Preserve Qcms","description":"Whether to preserve existing QCMs","default":true}},"type":"object","required":["prompt"],"title":"RewriteUnitRequest","description":"Request model for rewriting a unit with AI assistance."},"RolloutFunnelStats":{"properties":{"group":{"type":"string","title":"Group"},"targeted":{"type":"integer","title":"Targeted","default":0},"eligible":{"type":"integer","title":"Eligible","default":0},"popup_seen":{"type":"integer","title":"Popup Seen","default":0},"popup_clicked":{"type":"integer","title":"Popup Clicked","default":0},"popup_dismissed":{"type":"integer","title":"Popup Dismissed","default":0},"banner_clicked":{"type":"integer","title":"Banner Clicked","default":0},"cahier_opened":{"type":"integer","title":"Cahier Opened","default":0},"started":{"type":"integer","title":"Started","default":0},"completed_one_sub_chapitre":{"type":"integer","title":"Completed One Sub Chapitre","default":0},"active_last_7_days":{"type":"integer","title":"Active Last 7 Days","default":0},"total_time_spent_seconds":{"type":"integer","title":"Total Time Spent Seconds","default":0}},"type":"object","required":["group"],"title":"RolloutFunnelStats"},"RolloutReportResponse":{"properties":{"generated_at":{"type":"string","title":"Generated At"},"since":{"type":"string","title":"Since","description":"Campaign start date: only progress created on/after this date counts"},"classes":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Classes","description":"group -> seasonal classe name"},"total":{"$ref":"#/components/schemas/RolloutFunnelStats"},"groups":{"items":{"$ref":"#/components/schemas/RolloutFunnelStats"},"type":"array","title":"Groups"},"students":{"items":{"$ref":"#/components/schemas/RolloutStudentRow"},"type":"array","title":"Students"},"non_eligible_with_activity":{"type":"integer","title":"Non Eligible With Activity","description":"Students active on the seasonal cahiers but outside the rollout target (buyers, admins...)","default":0}},"type":"object","required":["generated_at","since","total","groups","students"],"title":"RolloutReportResponse"},"RolloutStudentRow":{"properties":{"student_id":{"type":"string","title":"Student Id"},"name":{"type":"string","title":"Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group"},"targeted":{"type":"boolean","title":"Targeted"},"has_class":{"type":"boolean","title":"Has Class"},"eligible":{"type":"boolean","title":"Eligible"},"popup_seen_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popup Seen At"},"popup_clicked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popup Clicked At"},"popup_dismissed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popup Dismissed At"},"banner_clicked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Clicked At"},"cahier_opened_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cahier Opened At"},"pre_campaign":{"type":"boolean","title":"Pre Campaign","default":false},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"last_activity_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Activity At"},"sub_chapitres_started":{"type":"integer","title":"Sub Chapitres Started","default":0},"sub_chapitres_completed":{"type":"integer","title":"Sub Chapitres Completed","default":0},"exercises_completed":{"type":"integer","title":"Exercises Completed","default":0},"exercise_attempts":{"type":"integer","title":"Exercise Attempts","default":0},"time_spent_seconds":{"type":"integer","title":"Time Spent Seconds","default":0},"funnel_stage":{"type":"string","title":"Funnel Stage"}},"type":"object","required":["student_id","name","targeted","has_class","eligible","funnel_stage"],"title":"RolloutStudentRow"},"RotatePageBody":{"properties":{"page_index":{"type":"integer","title":"Page Index"},"direction":{"type":"string","enum":["cw","ccw"],"title":"Direction"}},"type":"object","required":["page_index","direction"],"title":"RotatePageBody"},"RubricCriterion":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"max_points":{"type":"number","title":"Max Points"},"levels":{"items":{"$ref":"#/components/schemas/RubricLevel"},"type":"array","title":"Levels","default":[]}},"type":"object","required":["label","max_points"],"title":"RubricCriterion","description":"A gradable question/criterion within an exercise."},"RubricEvaluation":{"properties":{"rubric_id":{"type":"string","title":"Rubric Id"},"author":{"oneOf":[{"$ref":"#/components/schemas/AIAuthor"},{"$ref":"#/components/schemas/HumanAuthor"}],"title":"Author","discriminator":{"propertyName":"type","mapping":{"ai":"#/components/schemas/AIAuthor","human":"#/components/schemas/HumanAuthor"}}},"feedback":{"type":"string","title":"Feedback"},"questions":{"items":{"$ref":"#/components/schemas/RubricQuestionEvaluation"},"type":"array","title":"Questions"},"question_zones":{"items":{"$ref":"#/components/schemas/QuestionZone"},"type":"array","title":"Question Zones"},"computed_grade":{"type":"number","title":"Computed Grade"},"max_grade":{"type":"number","title":"Max Grade"},"evaluated_at":{"type":"string","format":"date-time","title":"Evaluated At"}},"type":"object","required":["rubric_id","author","feedback","questions","computed_grade","max_grade","evaluated_at"],"title":"RubricEvaluation","description":"One evaluation pass over a submission against a specific rubric. Multiple\nmay exist per submission attempt (initial AI + teacher overrides); the latest\none is canonical."},"RubricEvaluationResponse":{"properties":{"rubric_id":{"type":"string","title":"Rubric Id"},"author_type":{"type":"string","enum":["ai","human"],"title":"Author Type"},"feedback":{"type":"string","title":"Feedback"},"questions":{"items":{"$ref":"#/components/schemas/RubricQuestionEvaluation"},"type":"array","title":"Questions"},"question_zones":{"items":{"$ref":"#/components/schemas/QuestionZone"},"type":"array","title":"Question Zones"},"computed_grade":{"type":"number","title":"Computed Grade"},"max_grade":{"type":"number","title":"Max Grade"},"evaluated_at":{"type":"string","format":"date-time","title":"Evaluated At"}},"type":"object","required":["rubric_id","author_type","feedback","questions","question_zones","computed_grade","max_grade","evaluated_at"],"title":"RubricEvaluationResponse"},"RubricExercise":{"properties":{"exercise_id":{"type":"integer","title":"Exercise Id"},"exercise_title":{"type":"string","title":"Exercise Title"},"max_points":{"type":"number","title":"Max Points"},"criteria":{"items":{"$ref":"#/components/schemas/RubricCriterion"},"type":"array","title":"Criteria","default":[]}},"type":"object","required":["exercise_id","exercise_title","max_points"],"title":"RubricExercise","description":"Rubric for one exam exercise."},"RubricLevel":{"properties":{"points":{"type":"number","title":"Points"},"description":{"type":"string","title":"Description"}},"type":"object","required":["points","description"],"title":"RubricLevel","description":"A scoring level within a rubric criterion."},"RubricOverrideRequest":{"properties":{"questions":{"items":{"$ref":"#/components/schemas/_PutRubricQuestion"},"type":"array","maxItems":50,"title":"Questions"}},"type":"object","required":["questions"],"title":"RubricOverrideRequest"},"RubricQuestion":{"properties":{"question_text":{"type":"string","title":"Question Text"},"skills":{"items":{"$ref":"#/components/schemas/SkillRef"},"type":"array","title":"Skills"},"criteria":{"items":{"type":"string"},"type":"array","title":"Criteria"}},"type":"object","required":["question_text","skills","criteria"],"title":"RubricQuestion","description":"`criteria` are atomic, exercise-specific facts (e.g. \"Wrote f(x) = (x-2)² - 1\");\neach contributes 1 point to the grade. `skills` are analytics-only — they do\nnot affect the grade."},"RubricQuestionEvaluation":{"properties":{"skill_outcomes":{"items":{"$ref":"#/components/schemas/SkillOutcome"},"type":"array","title":"Skill Outcomes"},"criterion_outcomes":{"items":{"$ref":"#/components/schemas/CriterionOutcome"},"type":"array","title":"Criterion Outcomes"},"errors":{"items":{"$ref":"#/components/schemas/FlaggedError"},"type":"array","title":"Errors"}},"type":"object","required":["skill_outcomes","criterion_outcomes","errors"],"title":"RubricQuestionEvaluation","description":"One eval pass over one rubric question. Position in the parent list\nmatches the rubric's question position; the rubric is the source of truth\nfor question_text, skill set, and criterion list."},"RubricResponse":{"properties":{"id":{"type":"string","title":"Id"},"questions":{"items":{"$ref":"#/components/schemas/RubricQuestion"},"type":"array","title":"Questions"},"author_type":{"type":"string","enum":["ai","human"],"title":"Author Type"}},"type":"object","required":["id","questions","author_type"],"title":"RubricResponse","description":"Minimal: drops `exercise_id` (lives in the URL) and\n`exercise_collection` / `created_at` (frontend doesn't read them today).\n`author` is flattened to a Literal to avoid leaking prompt ids / user ids."},"RunDiagnosticRequest":{"properties":{"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"},"chapter_tag_id":{"type":"string","title":"Chapter Tag Id"}},"type":"object","required":["exercise_ids","chapter_tag_id"],"title":"RunDiagnosticRequest"},"RunRecorrectionRequest":{"properties":{"scope":{"anyOf":[{"items":{"$ref":"#/components/schemas/RecorrectionScopeItem"},"type":"array"},{"type":"null"}],"title":"Scope"}},"type":"object","title":"RunRecorrectionRequest"},"SFCoverageChapter":{"properties":{"chapter_display":{"type":"string","title":"Chapter Display"},"savoirs_faire":{"items":{"$ref":"#/components/schemas/SFCoverageItem"},"type":"array","title":"Savoirs Faire"},"untagged_exercise_count":{"type":"integer","title":"Untagged Exercise Count"},"total_exercise_count":{"type":"integer","title":"Total Exercise Count"}},"type":"object","required":["chapter_display","savoirs_faire","untagged_exercise_count","total_exercise_count"],"title":"SFCoverageChapter"},"SFCoverageDifficultyBreakdown":{"properties":{"easy":{"type":"integer","title":"Easy","default":0},"medium":{"type":"integer","title":"Medium","default":0},"hard":{"type":"integer","title":"Hard","default":0},"unknown":{"type":"integer","title":"Unknown","default":0}},"type":"object","title":"SFCoverageDifficultyBreakdown"},"SFCoverageGrade":{"properties":{"grade_key":{"type":"string","title":"Grade Key"},"grade_display":{"type":"string","title":"Grade Display"},"sort_order":{"type":"integer","title":"Sort Order"},"chapters":{"items":{"$ref":"#/components/schemas/SFCoverageChapter"},"type":"array","title":"Chapters"}},"type":"object","required":["grade_key","grade_display","sort_order","chapters"],"title":"SFCoverageGrade"},"SFCoverageItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"exercise_count":{"type":"integer","title":"Exercise Count"},"by_difficulty":{"$ref":"#/components/schemas/SFCoverageDifficultyBreakdown"}},"type":"object","required":["id","name","exercise_count","by_difficulty"],"title":"SFCoverageItem"},"SFCoverageResponse":{"properties":{"grades":{"items":{"$ref":"#/components/schemas/SFCoverageGrade"},"type":"array","title":"Grades"}},"type":"object","required":["grades"],"title":"SFCoverageResponse"},"SampleFromExerciseSessionSolutionsRequest":{"properties":{"dataset":{"type":"string","minLength":1,"title":"Dataset"},"sample_count":{"type":"integer","minimum":1.0,"title":"Sample Count"}},"type":"object","required":["dataset","sample_count"],"title":"SampleFromExerciseSessionSolutionsRequest"},"SampleFromExerciseSessionSolutionsResponse":{"properties":{"dataset":{"type":"string","title":"Dataset"},"sample_count":{"type":"integer","title":"Sample Count"},"available_candidates":{"type":"integer","title":"Available Candidates"},"created_count":{"type":"integer","title":"Created Count"},"images":{"items":{"$ref":"#/components/schemas/TranscriptionTestImage"},"type":"array","title":"Images"}},"type":"object","required":["dataset","sample_count","available_candidates","created_count"],"title":"SampleFromExerciseSessionSolutionsResponse"},"SaveDiagramUrlsRequest":{"properties":{"diagram_image_urls":{"items":{"type":"string"},"type":"array","title":"Diagram Image Urls"}},"type":"object","required":["diagram_image_urls"],"title":"SaveDiagramUrlsRequest"},"SaveOnboardingPerformanceRequest":{"properties":{"course_name":{"type":"string","title":"Course Name"},"topic_name":{"type":"string","title":"Topic Name"},"final_level":{"type":"integer","title":"Final Level"},"history":{"items":{"$ref":"#/components/schemas/LevelSelectionHistoryInput"},"type":"array","title":"History"}},"type":"object","required":["course_name","topic_name","final_level","history"],"title":"SaveOnboardingPerformanceRequest"},"SaveParentEmailRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"SaveParentEmailRequest"},"SavoirFaireCreate":{"properties":{"name":{"type":"string","minLength":1,"title":"Name"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"chapter_links":{"items":{"$ref":"#/components/schemas/ChapterLink"},"type":"array","title":"Chapter Links"}},"type":"object","required":["name"],"title":"SavoirFaireCreate"},"SavoirFaireListItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"}},"type":"object","required":["id","name","description"],"title":"SavoirFaireListItem","description":"Lightweight list item for the rubric editor's skill picker."},"SavoirFaireOut":{"properties":{"id":{"type":"string","title":"Id"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"chapter_links":{"items":{"$ref":"#/components/schemas/ChapterLink"},"type":"array","title":"Chapter Links"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name"],"title":"SavoirFaireOut"},"SavoirFaireUpdate":{"properties":{"name":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"chapter_links":{"anyOf":[{"items":{"$ref":"#/components/schemas/ChapterLink"},"type":"array"},{"type":"null"}],"title":"Chapter Links"}},"type":"object","title":"SavoirFaireUpdate","description":"Partial update — fields omitted are left untouched."},"SavoirsFaireIdsUpdate":{"properties":{"savoirs_faire_ids":{"items":{"type":"string"},"type":"array","title":"Savoirs Faire Ids"}},"type":"object","title":"SavoirsFaireIdsUpdate","description":"Replace the full `savoirs_faire_ids` list on an exercise.\n\nSet semantics (not diff): the list coming in is persisted verbatim, so\nclearing all tags is expressed as `{savoirs_faire_ids: []}`."},"ScanFileRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"ScanFileRequest"},"ScanLatexRequest":{"properties":{"image_url":{"type":"string","title":"Image Url"}},"type":"object","required":["image_url"],"title":"ScanLatexRequest"},"SchoolAnalyticsResponse":{"properties":{"school_id":{"type":"string","title":"School Id"},"school_name":{"type":"string","title":"School Name"},"school_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Domain"},"total_teachers":{"type":"integer","title":"Total Teachers"},"total_classes":{"type":"integer","title":"Total Classes"},"total_students":{"type":"integer","title":"Total Students"},"total_exercises_completed":{"type":"integer","title":"Total Exercises Completed"},"total_homework_exercises":{"type":"integer","title":"Total Homework Exercises"},"total_teacher_exams":{"type":"integer","title":"Total Teacher Exams"},"total_courses":{"type":"integer","title":"Total Courses"},"total_teacher_assignments":{"type":"integer","title":"Total Teacher Assignments"},"total_chat_words":{"type":"integer","title":"Total Chat Words"},"total_time_spent_hours":{"type":"number","title":"Total Time Spent Hours"},"active_students_last_month":{"type":"integer","title":"Active Students Last Month"},"weekly_activity":{"additionalProperties":{"type":"integer"},"type":"object","title":"Weekly Activity"},"weekly_homework_activity":{"additionalProperties":{"type":"integer"},"type":"object","title":"Weekly Homework Activity"},"teachers":{"items":{"$ref":"#/components/schemas/SchoolTeacherAnalytics"},"type":"array","title":"Teachers"},"classes":{"items":{"$ref":"#/components/schemas/SchoolClassAnalytics"},"type":"array","title":"Classes"},"weeks_analyzed":{"type":"integer","title":"Weeks Analyzed"},"analysis_start_date":{"type":"string","format":"date-time","title":"Analysis Start Date"},"analysis_end_date":{"type":"string","format":"date-time","title":"Analysis End Date"}},"type":"object","required":["school_id","school_name","total_teachers","total_classes","total_students","total_exercises_completed","total_homework_exercises","total_teacher_exams","total_courses","total_teacher_assignments","total_chat_words","total_time_spent_hours","active_students_last_month","weekly_activity","weekly_homework_activity","teachers","classes","weeks_analyzed","analysis_start_date","analysis_end_date"],"title":"SchoolAnalyticsResponse","description":"Complete analytics response for a school"},"SchoolBetaUpdateRequest":{"properties":{"school_id":{"type":"string","title":"School Id"}},"type":"object","required":["school_id"],"title":"SchoolBetaUpdateRequest"},"SchoolClassAnalytics":{"properties":{"class_id":{"type":"string","title":"Class Id"},"class_name":{"type":"string","title":"Class Name"},"teacher_name":{"type":"string","title":"Teacher Name"},"total_students":{"type":"integer","title":"Total Students"},"active_students_last_month":{"type":"integer","title":"Active Students Last Month"},"total_exercises_completed":{"type":"integer","title":"Total Exercises Completed"},"total_homework_exercises":{"type":"integer","title":"Total Homework Exercises"},"total_chat_words":{"type":"integer","title":"Total Chat Words"},"total_time_spent_hours":{"type":"number","title":"Total Time Spent Hours"},"weekly_activity":{"additionalProperties":{"type":"integer"},"type":"object","title":"Weekly Activity"},"weekly_homework_activity":{"additionalProperties":{"type":"integer"},"type":"object","title":"Weekly Homework Activity"}},"type":"object","required":["class_id","class_name","teacher_name","total_students","active_students_last_month","total_exercises_completed","total_homework_exercises","total_chat_words","total_time_spent_hours","weekly_activity","weekly_homework_activity"],"title":"SchoolClassAnalytics","description":"Analytics data for a class in a school"},"SchoolCodeAnalyticsResponse":{"properties":{"school_code":{"$ref":"#/components/schemas/SchoolCodeResponse"},"total_students":{"type":"integer","title":"Total Students"},"avg_time_spent_hours":{"type":"number","title":"Avg Time Spent Hours"},"avg_exercises_completed":{"type":"number","title":"Avg Exercises Completed"},"avg_completion_percentage":{"type":"number","title":"Avg Completion Percentage"},"students":{"items":{"$ref":"#/components/schemas/StudentHolidayStatsResponse"},"type":"array","title":"Students"}},"type":"object","required":["school_code","total_students","avg_time_spent_hours","avg_exercises_completed","avg_completion_percentage","students"],"title":"SchoolCodeAnalyticsResponse","description":"Response model for school code analytics."},"SchoolCodeCreate":{"properties":{"code":{"type":"string","minLength":1,"title":"Code"},"school_name":{"type":"string","minLength":1,"title":"School Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"max_uses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Uses"}},"type":"object","required":["code","school_name"],"title":"SchoolCodeCreate","description":"Request model for creating a school code."},"SchoolCodeResponse":{"properties":{"id":{"type":"string","title":"Id"},"code":{"type":"string","title":"Code"},"school_name":{"type":"string","title":"School Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"type":"boolean","title":"Is Active"},"max_uses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Uses"},"current_uses":{"type":"integer","title":"Current Uses"},"created_by":{"type":"string","title":"Created By"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","code","school_name","is_active","current_uses","created_by","created_at","updated_at"],"title":"SchoolCodeResponse","description":"Response model for school code details."},"SchoolCodeUpdate":{"properties":{"school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"max_uses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Uses"}},"type":"object","title":"SchoolCodeUpdate","description":"Request model for updating a school code."},"SchoolCodeUsageResponse":{"properties":{"id":{"type":"string","title":"Id"},"student_id":{"type":"string","title":"Student Id"},"student_email":{"type":"string","title":"Student Email"},"school_code_id":{"type":"string","title":"School Code Id"},"used_at":{"type":"string","format":"date-time","title":"Used At"}},"type":"object","required":["id","student_id","student_email","school_code_id","used_at"],"title":"SchoolCodeUsageResponse","description":"Response model for school code usage tracking."},"SchoolContractCreateRequest":{"properties":{"contract_type":{"type":"string","enum":["pilot","paid"],"title":"Contract Type"},"start_date":{"type":"string","format":"date-time","title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"},"billed_students":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Billed Students"},"expected_teachers_count":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Expected Teachers Count"},"price_per_student_monthly_eur":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Price Per Student Monthly Eur"},"free_months":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Free Months"},"owner_admin_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Admin Id"},"referent_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referent Name"},"referent_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referent Email"},"referent_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referent Role"},"signed_document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Signed Document Date"},"signed_document_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed Document Url"},"pennylane_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pennylane Url"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["contract_type","start_date"],"title":"SchoolContractCreateRequest"},"SchoolContractGestureCreateRequest":{"properties":{"reason":{"type":"string","minLength":1,"title":"Reason"}},"type":"object","required":["reason"],"title":"SchoolContractGestureCreateRequest"},"SchoolContractGestureResponse":{"properties":{"id":{"type":"string","title":"Id"},"contract_id":{"type":"string","title":"Contract Id"},"days":{"type":"integer","title":"Days"},"reason":{"type":"string","title":"Reason"},"granted_by_admin_id":{"type":"string","title":"Granted By Admin Id"},"granted_by_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted By Name"},"previous_end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Previous End Date"},"new_end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"New End Date"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","contract_id","days","reason","granted_by_admin_id","created_at"],"title":"SchoolContractGestureResponse"},"SchoolContractResponse":{"properties":{"id":{"type":"string","title":"Id"},"school_id":{"type":"string","title":"School Id"},"contract_type":{"type":"string","enum":["pilot","paid"],"title":"Contract Type"},"start_date":{"type":"string","format":"date-time","title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"},"billed_students":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Billed Students"},"expected_teachers_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Teachers Count"},"price_per_student_monthly_eur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Per Student Monthly Eur"},"free_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Free Months"},"owner_admin_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Admin Id"},"owner_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Name"},"referent_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referent Name"},"referent_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referent Email"},"referent_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referent Role"},"signed_document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Signed Document Date"},"signed_document_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed Document Url"},"pennylane_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pennylane Url"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"status":{"type":"string","enum":["active","upcoming","ended"],"title":"Status"},"gesture":{"anyOf":[{"$ref":"#/components/schemas/SchoolContractGestureResponse"},{"type":"null"}]}},"type":"object","required":["id","school_id","contract_type","start_date","created_at","updated_at","status"],"title":"SchoolContractResponse"},"SchoolContractUpdateRequest":{"properties":{"contract_type":{"anyOf":[{"type":"string","enum":["pilot","paid"]},{"type":"null"}],"title":"Contract Type"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"},"billed_students":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Billed Students"},"expected_teachers_count":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Expected Teachers Count"},"price_per_student_monthly_eur":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Price Per Student Monthly Eur"},"free_months":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Free Months"},"owner_admin_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Admin Id"},"referent_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referent Name"},"referent_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referent Email"},"referent_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referent Role"},"signed_document_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Signed Document Date"},"signed_document_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed Document Url"},"pennylane_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pennylane Url"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"SchoolContractUpdateRequest"},"SchoolCreateRequest":{"properties":{"name":{"type":"string","minLength":1,"title":"Name"},"email_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Domain"},"french_school_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"French School Id"},"contact_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Contact Email"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"max_teachers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Teachers"},"max_students":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Students"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"expected_teachers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Expected Teachers"}},"type":"object","required":["name"],"title":"SchoolCreateRequest","description":"Request model for creating a school"},"SchoolInfo":{"properties":{"contract_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Type"},"contract_start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Contract Start Date"},"contract_end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Contract End Date"},"first_teacher_created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Teacher Created At"}},"type":"object","title":"SchoolInfo","description":"School information displayed when a specific school is selected."},"SchoolLeaderboardEntry":{"properties":{"school_id":{"type":"string","title":"School Id"},"school_name":{"type":"string","title":"School Name"},"avg_time_seconds":{"type":"number","title":"Avg Time Seconds"},"player_count":{"type":"integer","title":"Player Count"},"rank":{"type":"integer","title":"Rank"},"is_current_user_school":{"type":"boolean","title":"Is Current User School","default":false}},"type":"object","required":["school_id","school_name","avg_time_seconds","player_count","rank"],"title":"SchoolLeaderboardEntry"},"SchoolLeaderboardResponse":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/SchoolLeaderboardEntry"},"type":"array","title":"Entries"},"current_school_entry":{"anyOf":[{"$ref":"#/components/schemas/SchoolLeaderboardEntry"},{"type":"null"}]}},"type":"object","required":["entries"],"title":"SchoolLeaderboardResponse"},"SchoolProductAdoptionItem":{"properties":{"school_id":{"type":"string","title":"School Id"},"school_name":{"type":"string","title":"School Name"},"contract_status":{"type":"string","enum":["none","pilot","paid"],"title":"Contract Status"},"total_teachers":{"type":"integer","title":"Total Teachers"},"active_teachers":{"type":"integer","title":"Active Teachers"},"teacher_active_rate":{"type":"number","title":"Teacher Active Rate"},"total_classes":{"type":"integer","title":"Total Classes"},"active_classes":{"type":"integer","title":"Active Classes"},"class_active_rate":{"type":"number","title":"Class Active Rate"},"total_students":{"type":"integer","title":"Total Students"},"active_students":{"type":"integer","title":"Active Students"},"student_active_rate":{"type":"number","title":"Student Active Rate"},"teacher_devoirs_adoption_rate":{"type":"number","title":"Teacher Devoirs Adoption Rate"},"teacher_cours_adoption_rate":{"type":"number","title":"Teacher Cours Adoption Rate"},"teacher_evaluations_adoption_rate":{"type":"number","title":"Teacher Evaluations Adoption Rate"},"student_dm_adoption_rate":{"type":"number","title":"Student Dm Adoption Rate"},"student_exercices_excellence_adoption_rate":{"type":"number","title":"Student Exercices Excellence Adoption Rate"},"student_aide_devoirs_adoption_rate":{"type":"number","title":"Student Aide Devoirs Adoption Rate"},"student_coach_examen_adoption_rate":{"type":"number","title":"Student Coach Examen Adoption Rate"},"student_cours_adoption_rate":{"type":"number","title":"Student Cours Adoption Rate"}},"type":"object","required":["school_id","school_name","contract_status","total_teachers","active_teachers","teacher_active_rate","total_classes","active_classes","class_active_rate","total_students","active_students","student_active_rate","teacher_devoirs_adoption_rate","teacher_cours_adoption_rate","teacher_evaluations_adoption_rate","student_dm_adoption_rate","student_exercices_excellence_adoption_rate","student_aide_devoirs_adoption_rate","student_coach_examen_adoption_rate","student_cours_adoption_rate"],"title":"SchoolProductAdoptionItem"},"SchoolResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"email_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Domain"},"uai":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uai"},"french_school_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"French School Id"},"french_school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"French School Name"},"contact_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Contact Email"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"contract_type":{"type":"string","enum":["free","pilot","paid","expired"],"title":"Contract Type"},"contract_start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Contract Start Date"},"contract_end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Contract End Date"},"max_teachers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Teachers"},"max_students":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Students"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"expected_teachers":{"items":{"type":"string"},"type":"array","title":"Expected Teachers","default":[]},"created_by":{"type":"string","title":"Created By"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"current_contract_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Contract Id"},"current_contract_status":{"anyOf":[{"type":"string","enum":["active","upcoming","ended"]},{"type":"null"}],"title":"Current Contract Status"},"teacher_count":{"type":"integer","title":"Teacher Count","default":0}},"type":"object","required":["id","name","contract_type","created_by","created_at","updated_at"],"title":"SchoolResponse","description":"Response model for school"},"SchoolSearchResponse":{"properties":{"id":{"type":"string","title":"Id"},"uai":{"type":"string","title":"Uai"},"name":{"type":"string","title":"Name"},"postal_code":{"type":"string","title":"Postal Code"},"region":{"type":"string","title":"Region"},"city":{"type":"string","title":"City"},"kind":{"type":"string","title":"Kind","default":"france"},"country":{"type":"string","title":"Country","default":"France"},"b2b_school_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"B2B School Id"},"b2b_school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"B2B School Name"}},"type":"object","required":["id","uai","name","postal_code","region","city"],"title":"SchoolSearchResponse","description":"Response model for school search"},"SchoolStatsResponse":{"properties":{"school_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Id"},"school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Name"},"school_info":{"anyOf":[{"$ref":"#/components/schemas/SchoolInfo"},{"type":"null"}]},"period_start":{"type":"string","format":"date-time","title":"Period Start"},"period_end":{"type":"string","format":"date-time","title":"Period End"},"teacher_stats":{"$ref":"#/components/schemas/TeacherStats"},"student_stats":{"$ref":"#/components/schemas/StudentStats"},"establishment_stats":{"$ref":"#/components/schemas/EstablishmentStats"},"teacher_activity_by_month":{"items":{"$ref":"#/components/schemas/MonthlyTeacherActivity"},"type":"array","title":"Teacher Activity By Month"},"student_activity_by_month":{"items":{"$ref":"#/components/schemas/MonthlyStudentActivity"},"type":"array","title":"Student Activity By Month"},"teachers_table":{"items":{"$ref":"#/components/schemas/TeacherTableRow"},"type":"array","title":"Teachers Table"},"classes_table":{"items":{"$ref":"#/components/schemas/ClassTableRow"},"type":"array","title":"Classes Table"}},"type":"object","required":["school_id","school_name","period_start","period_end","teacher_stats","student_stats","establishment_stats","teacher_activity_by_month","student_activity_by_month","teachers_table","classes_table"],"title":"SchoolStatsResponse"},"SchoolStudentRow":{"properties":{"student_id":{"type":"string","title":"Student Id"},"student_name":{"type":"string","title":"Student Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"class_names":{"items":{"type":"string"},"type":"array","title":"Class Names"},"class_name":{"type":"string","title":"Class Name"}},"type":"object","required":["student_id","student_name","class_names","class_name"],"title":"SchoolStudentRow"},"SchoolStudentsResponse":{"properties":{"school_name":{"type":"string","title":"School Name"},"email_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Domain"},"student_count":{"type":"integer","title":"Student Count"},"students":{"items":{"$ref":"#/components/schemas/SchoolStudentRow"},"type":"array","title":"Students"}},"type":"object","required":["school_name","student_count","students"],"title":"SchoolStudentsResponse"},"SchoolSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"SchoolSummary"},"SchoolTeacher":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"SchoolTeacher"},"SchoolTeacherAnalytics":{"properties":{"teacher_id":{"type":"string","title":"Teacher Id"},"teacher_name":{"type":"string","title":"Teacher Name"},"teacher_email":{"type":"string","title":"Teacher Email"},"total_classes":{"type":"integer","title":"Total Classes"},"total_students":{"type":"integer","title":"Total Students"},"total_exercises_completed":{"type":"integer","title":"Total Exercises Completed"},"total_homework_exercises":{"type":"integer","title":"Total Homework Exercises"},"total_teacher_exams":{"type":"integer","title":"Total Teacher Exams"},"total_courses":{"type":"integer","title":"Total Courses"},"total_teacher_assignments":{"type":"integer","title":"Total Teacher Assignments"},"total_chat_words":{"type":"integer","title":"Total Chat Words"},"total_time_spent_hours":{"type":"number","title":"Total Time Spent Hours"},"active_students_last_month":{"type":"integer","title":"Active Students Last Month"},"segments":{"items":{"type":"string","enum":["college","lycee","prepa"]},"type":"array","title":"Segments"},"weekly_activity":{"additionalProperties":{"type":"integer"},"type":"object","title":"Weekly Activity"},"weekly_homework_activity":{"additionalProperties":{"type":"integer"},"type":"object","title":"Weekly Homework Activity"}},"type":"object","required":["teacher_id","teacher_name","teacher_email","total_classes","total_students","total_exercises_completed","total_homework_exercises","total_teacher_exams","total_courses","total_teacher_assignments","total_chat_words","total_time_spent_hours","active_students_last_month","weekly_activity","weekly_homework_activity"],"title":"SchoolTeacherAnalytics","description":"Analytics data for a teacher in a school"},"SchoolTeacherInfo":{"properties":{"id":{"type":"string","title":"Id"},"full_name":{"type":"string","title":"Full Name"},"email":{"type":"string","title":"Email"}},"type":"object","required":["id","full_name","email"],"title":"SchoolTeacherInfo","description":"Teacher info for sharing selection"},"SchoolUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Domain"},"french_school_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"French School Id"},"contact_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Contact Email"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"max_teachers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Teachers"},"max_students":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Students"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"expected_teachers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Expected Teachers"}},"type":"object","title":"SchoolUpdateRequest","description":"Request model for updating a school"},"SchoolUploadResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"schools_count":{"type":"integer","title":"Schools Count"}},"type":"object","required":["success","message","schools_count"],"title":"SchoolUploadResponse","description":"Response model for CSV upload"},"ScopeSplit":{"properties":{"scope":{"type":"string","enum":["exercise","session"],"title":"Scope"},"envois":{"type":"integer","title":"Envois"},"attempts":{"type":"integer","title":"Attempts"}},"type":"object","required":["scope","envois","attempts"],"title":"ScopeSplit"},"SearchHit":{"properties":{"type":{"type":"string","enum":["Unit Title","Unit Summary","Unit Content","Flashcard Front","Flashcard Back","QCM Question","QCM Option","QCM Explanation"],"title":"Type"},"location_path":{"type":"string","title":"Location Path"},"item_title":{"type":"string","title":"Item Title"},"context_snippet":{"type":"string","title":"Context Snippet"},"course_id":{"type":"string","title":"Course Id"},"item_id":{"type":"string","title":"Item Id"}},"type":"object","required":["type","location_path","item_title","context_snippet","course_id","item_id"],"title":"SearchHit","description":"Response model for search hits with contextual information."},"SearchTeachersResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"role":{"type":"string","title":"Role"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"is_already_in_school":{"type":"boolean","title":"Is Already In School","default":false}},"type":"object","required":["id","email","role"],"title":"SearchTeachersResponse","description":"Response model for searching teachers"},"SeasonalEligibilityResponse":{"properties":{"eligible":{"type":"boolean","title":"Eligible"},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group"},"classe_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Classe Id"},"classe_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Classe Name"}},"type":"object","required":["eligible"],"title":"SeasonalEligibilityResponse","description":"Whether the student is targeted by the seasonal holiday-course rollout."},"SeasonalTrackingRequest":{"properties":{"event_type":{"type":"string","enum":["popup_seen","popup_cta_clicked","popup_dismissed","banner_clicked","cahier_opened"],"title":"Event Type"},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group"},"classe_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Classe Id"}},"type":"object","required":["event_type"],"title":"SeasonalTrackingRequest","description":"Funnel event emitted by the seasonal rollout entry points (popup, banner, cahier)."},"SelfStudyAttemptResponse":{"properties":{"id":{"type":"string","title":"Id"},"quiz_id":{"type":"string","title":"Quiz Id"},"user_id":{"type":"string","title":"User Id"},"course_id":{"type":"string","title":"Course Id"},"status":{"type":"string","title":"Status"},"score_out_of_20":{"type":"number","title":"Score Out Of 20"},"correct_count":{"type":"integer","title":"Correct Count"},"total_questions":{"type":"integer","title":"Total Questions"},"attempt_number":{"type":"integer","title":"Attempt Number"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"answers":{"items":{"$ref":"#/components/schemas/QuizAnswerRecord"},"type":"array","title":"Answers"}},"type":"object","required":["id","quiz_id","user_id","course_id","status","score_out_of_20","correct_count","total_questions","attempt_number","started_at"],"title":"SelfStudyAttemptResponse","description":"Response for a self-study quiz attempt (no assignment)."},"SelfStudyHistoryResponse":{"properties":{"attempts":{"items":{"$ref":"#/components/schemas/SelfStudyAttemptResponse"},"type":"array","title":"Attempts"},"best_score":{"type":"number","title":"Best Score"},"attempts_count":{"type":"integer","title":"Attempts Count"}},"type":"object","required":["attempts","best_score","attempts_count"],"title":"SelfStudyHistoryResponse","description":"Response for self-study quiz history."},"SendMessageRequest":{"properties":{"thread_id":{"type":"string","title":"Thread Id"},"message":{"type":"string","title":"Message"},"type":{"type":"string","title":"Type","default":"text"}},"type":"object","required":["thread_id","message"],"title":"SendMessageRequest"},"SendTestEmailRequest":{"properties":{"to_email":{"type":"string","format":"email","title":"To Email"},"subject":{"type":"string","maxLength":200,"minLength":1,"title":"Subject","default":"Excellence test email"},"message":{"type":"string","maxLength":5000,"minLength":1,"title":"Message","default":"Hello,\n\nThis is a test email sent from the Excellence admin email tester.\n\nBest,\nExcellence"}},"type":"object","required":["to_email"],"title":"SendTestEmailRequest"},"SendTestEmailResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"detail":{"type":"string","title":"Detail"}},"type":"object","required":["success","detail"],"title":"SendTestEmailResponse"},"SessionChatRequest":{"properties":{"message":{"type":"string","title":"Message"},"type":{"type":"string","enum":["text","image_url","image_description"],"title":"Type","default":"text"}},"type":"object","required":["message"],"title":"SessionChatRequest","description":"Minimal request body to handle user chat messages specifically for the session.\nUsing the same approach as your conversation system."},"SessionCreate":{"properties":{"topic_id":{"type":"string","title":"Topic Id"},"list_type":{"type":"string","title":"List Type"}},"type":"object","required":["topic_id","list_type"],"title":"SessionCreate","description":"Data needed to create a new session for a user."},"SessionData":{"properties":{"id":{"type":"string","title":"Id"},"topic_id":{"type":"string","title":"Topic Id"},"student_work_images":{"items":{"type":"string"},"type":"array","title":"Student Work Images"}},"type":"object","required":["id","topic_id"],"title":"SessionData","description":"Session data to return to the frontend."},"SessionFromChatRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"subject":{"anyOf":[{"type":"string","enum":["maths","physique-chimie"]},{"type":"null"}],"title":"Subject"},"exercises":{"items":{"$ref":"#/components/schemas/ChatSessionExerciseIn"},"type":"array","maxItems":8,"minItems":1,"title":"Exercises"}},"type":"object","required":["exercises"],"title":"SessionFromChatRequest"},"SessionFromChatResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["session_id"],"title":"SessionFromChatResponse"},"SessionGradeBreakdownResponse":{"properties":{"total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total"},"cells":{"items":{"anyOf":[{"$ref":"#/components/schemas/WeightedExerciseCellResponse"},{"type":"null"}]},"type":"array","title":"Cells"},"total_max":{"type":"number","title":"Total Max"}},"type":"object","required":["total","cells","total_max"],"title":"SessionGradeBreakdownResponse","description":"Canonical per-session grade payload — read by every résultats surface\nso the displayed note matches across teacher and student views."},"SessionInfo":{"properties":{"id":{"type":"string","title":"Id"},"topic_title":{"type":"string","title":"Topic Title"},"completed":{"type":"boolean","title":"Completed","default":false},"has_feedback":{"type":"boolean","title":"Has Feedback","default":false},"saw_feedback":{"type":"boolean","title":"Saw Feedback","default":false}},"type":"object","required":["id","topic_title"],"title":"SessionInfo"},"SessionNeedingFeedback":{"properties":{"id":{"type":"string","title":"Id"},"student_id":{"type":"string","title":"Student Id"},"student_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Name"},"student_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Email"},"topic_id":{"type":"string","title":"Topic Id"},"topic_name":{"type":"string","title":"Topic Name"},"exercise_name":{"type":"string","title":"Exercise Name"},"student_work_images":{"items":{"type":"string"},"type":"array","title":"Student Work Images"},"exercise_images":{"items":{"type":"string"},"type":"array","title":"Exercise Images"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","student_id","topic_id","topic_name","exercise_name","student_work_images","exercise_images","created_at"],"title":"SessionNeedingFeedback","description":"Session info for admin feedback page."},"SessionOut":{"properties":{"id":{"type":"string","title":"Id"},"topic":{"type":"string","title":"Topic"},"student_work_images":{"items":{"type":"string"},"type":"array","title":"Student Work Images"},"student_work_transcribed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Work Transcribed"},"student_reflexion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Reflexion"},"student_feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Feedback"},"student_feedback_media":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Student Feedback Media"},"saw_feedback":{"type":"boolean","title":"Saw Feedback","default":false}},"type":"object","required":["id","topic"],"title":"SessionOut","description":"Newly created session info."},"SessionPhotoSubmissionCreate":{"properties":{"photo_urls":{"items":{"type":"string"},"type":"array","maxItems":12,"minItems":1,"title":"Photo Urls"},"include_transcription":{"type":"boolean","title":"Include Transcription","default":false},"device_type":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Device Type"}},"type":"object","required":["photo_urls"],"title":"SessionPhotoSubmissionCreate","description":"Session-level \"je rends tout\" submission: photos are dispatched across\nthe session's exercises before per-exercise grading."},"SessionPhotoSubmissionResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/PhotoDispatchResultResponse"},"type":"array","title":"Results"}},"type":"object","required":["results"],"title":"SessionPhotoSubmissionResponse","description":"One entry per session exercise, in session order — including exercises\nno photo was mapped to (`attempt_index` null, empty `photo_indices`)."},"SessionWithFeedback":{"properties":{"id":{"type":"string","title":"Id"},"topic_id":{"type":"string","title":"Topic Id"},"topic_title":{"type":"string","title":"Topic Title"},"reflexion":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Reflexion"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"student_feedback":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Student Feedback"}},"type":"object","required":["id","topic_id","topic_title"],"title":"SessionWithFeedback","description":"Session info with feedback and reflexion."},"SetClassBody":{"properties":{"class_id":{"type":"string","title":"Class Id"}},"type":"object","required":["class_id"],"title":"SetClassBody"},"SetReviewTagRequest":{"properties":{"review_status":{"type":"string","enum":["to_hide","to_modify","to_keep"],"title":"Review Status"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["review_status"],"title":"SetReviewTagRequest"},"ShareExamRequest":{"properties":{"shared_with_school":{"type":"boolean","title":"Shared With School","default":false},"shared_with":{"items":{"type":"string"},"type":"array","title":"Shared With","default":[]},"read_only":{"type":"boolean","title":"Read Only","default":false}},"type":"object","title":"ShareExamRequest"},"ShareExamResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"sharing":{"$ref":"#/components/schemas/ShareExamRequest"}},"type":"object","required":["status","message","sharing"],"title":"ShareExamResponse"},"ShareExerciseRequest":{"properties":{"shared_with_school":{"type":"boolean","title":"Shared With School","default":false},"shared_with":{"items":{"type":"string"},"type":"array","title":"Shared With","default":[]},"read_only":{"type":"boolean","title":"Read Only","default":false}},"type":"object","title":"ShareExerciseRequest"},"ShareExerciseResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"}},"type":"object","required":["status","message"],"title":"ShareExerciseResponse"},"ShareExerciseWithTeacherRequest":{"properties":{"teacher_id":{"type":"string","title":"Teacher Id"}},"type":"object","required":["teacher_id"],"title":"ShareExerciseWithTeacherRequest"},"ShareExerciseWithTeacherResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"new_exercise_id":{"type":"string","title":"New Exercise Id"}},"type":"object","required":["status","message","new_exercise_id"],"title":"ShareExerciseWithTeacherResponse"},"ShareOptions":{"properties":{"read_only":{"type":"boolean","title":"Read Only","default":false},"shared_with":{"items":{"type":"string"},"type":"array","title":"Shared With","default":[]},"shared_with_school":{"type":"boolean","title":"Shared With School","default":false}},"type":"object","title":"ShareOptions"},"ShareResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"sharing":{"$ref":"#/components/schemas/ShareOptions"}},"type":"object","required":["status","message","sharing"],"title":"ShareResponse"},"ShareWithTeacherRequest":{"properties":{"teacher_id":{"type":"string","title":"Teacher Id"}},"type":"object","required":["teacher_id"],"title":"ShareWithTeacherRequest","description":"Request to share assignment with a specific teacher"},"ShareWithTeacherResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"new_assignment_id":{"type":"string","title":"New Assignment Id"}},"type":"object","required":["status","message","new_assignment_id"],"title":"ShareWithTeacherResponse","description":"Response after sharing assignment with a teacher"},"SharedAssignmentInfo":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"title":{"type":"string","title":"Title"},"teacher_name":{"type":"string","title":"Teacher Name"},"exercise_count":{"type":"integer","title":"Exercise Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"share_token":{"type":"string","title":"Share Token"}},"type":"object","required":["assignment_id","title","teacher_name","exercise_count","created_at","share_token"],"title":"SharedAssignmentInfo"},"SharingOptions":{"properties":{"shared_with_school":{"type":"boolean","title":"Shared With School","default":false},"shared_with":{"items":{"type":"string"},"type":"array","title":"Shared With"},"read_only":{"type":"boolean","title":"Read Only","default":false}},"type":"object","title":"SharingOptions","description":"Model for sharing configuration across folders, exams, and exercises"},"SimpleResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"}},"type":"object","required":["status","message"],"title":"SimpleResponse"},"SkillOutcome":{"properties":{"savoir_faire_id":{"type":"string","title":"Savoir Faire Id"},"outcome":{"type":"string","enum":["correct","partial","wrong","unanswered"],"title":"Outcome"},"note":{"type":"string","title":"Note"},"evidence":{"items":{"$ref":"#/components/schemas/EvidenceSpan"},"type":"array","title":"Evidence"}},"type":"object","required":["savoir_faire_id","outcome","note","evidence"],"title":"SkillOutcome","description":"Skills are analytics-only; they do not contribute to the grade.\n`savoir_faire_id` references `Rubric.questions[i].skills`; the frontend\nresolves the SkillRef via the rubric it already has in hand."},"SkillRef":{"properties":{"savoir_faire_id":{"type":"string","title":"Savoir Faire Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"}},"type":"object","required":["savoir_faire_id","name","description"],"title":"SkillRef","description":"The rubric snapshots `savoirs_faire` entries at rubric-creation time so that\nlater edits to the savoirs_faire collection don't retroactively change what a\nrubric describes. Evaluations do NOT re-snapshot — they reference skills by id\nand resolve through the rubric."},"SnapshotOut":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"},"doc_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Doc Counts"},"total_docs":{"type":"integer","title":"Total Docs"},"last_reset_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Reset At"},"reset_count":{"type":"integer","title":"Reset Count","default":0}},"type":"object","required":["id","created_at","doc_counts","total_docs"],"title":"SnapshotOut"},"SoftDeletePageBody":{"properties":{"page_index":{"type":"integer","title":"Page Index"}},"type":"object","required":["page_index"],"title":"SoftDeletePageBody"},"SolutionBlock":{"properties":{"id":{"type":"string","title":"Id"},"block_type":{"type":"string","enum":["text","image","tableau"],"title":"Block Type","default":"text"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"diagram_image_urls":{"items":{"type":"string"},"type":"array","title":"Diagram Image Urls"},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"transcribed_text":{"type":"string","title":"Transcribed Text","default":""},"transcription_suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcription Suggestion"},"tableau":{"anyOf":[{"$ref":"#/components/schemas/TableauPayload"},{"type":"null"}]},"ai_generated":{"type":"boolean","title":"Ai Generated","default":false},"is_correctly_oriented":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Correctly Oriented"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"position":{"type":"integer","title":"Position"}},"additionalProperties":false,"type":"object","required":["id","created_at","updated_at","position"],"title":"SolutionBlock","description":"Single block of solution content"},"SolutionBlockResponse":{"properties":{"id":{"type":"string","title":"Id"},"block_type":{"type":"string","enum":["text","image","tableau"],"title":"Block Type"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"diagram_image_urls":{"items":{"type":"string"},"type":"array","title":"Diagram Image Urls"},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"transcribed_text":{"type":"string","title":"Transcribed Text"},"transcription_suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcription Suggestion"},"position":{"type":"integer","title":"Position"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"tableau":{"anyOf":[{"$ref":"#/components/schemas/TableauPayload"},{"type":"null"}]},"etag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Etag"},"ai_generated":{"type":"boolean","title":"Ai Generated","default":false},"is_correctly_oriented":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Correctly Oriented"}},"type":"object","required":["id","block_type","image_urls","diagram_image_urls","transcribed_text","position","created_at","updated_at"],"title":"SolutionBlockResponse"},"SolutionCheckRequest":{"properties":{"student_transcribed_solution":{"type":"string","title":"Student Transcribed Solution"}},"type":"object","required":["student_transcribed_solution"],"title":"SolutionCheckRequest","description":"Request model for AI solution checking."},"SolutionCheckResponse":{"properties":{"correctness":{"type":"string","enum":["passed","failed"],"title":"Correctness"},"detailed_correctness":{"type":"string","enum":["correct","partial","wrong"],"title":"Detailed Correctness"},"feedback":{"type":"string","title":"Feedback"}},"type":"object","required":["correctness","detailed_correctness","feedback"],"title":"SolutionCheckResponse","description":"Response model for AI solution checking."},"SolutionRequest":{"properties":{"device_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Type"}},"type":"object","title":"SolutionRequest"},"SplitExamExerciseRequest":{"properties":{"number_of_splits":{"type":"integer","title":"Number Of Splits"},"custom_prompt":{"type":"string","title":"Custom Prompt","default":"diviser en exercices séparés avec des variations"}},"type":"object","required":["number_of_splits"],"title":"SplitExamExerciseRequest"},"SplitExerciseRequest":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"number_of_splits":{"type":"integer","maximum":50.0,"minimum":2.0,"title":"Number Of Splits","description":"Number of exercises to create (2-50)"},"custom_prompt":{"type":"string","title":"Custom Prompt","description":"Custom prompt for AI generation","default":"diviser en exercices séparés avec des variations"}},"type":"object","required":["exercise_id","number_of_splits"],"title":"SplitExerciseRequest"},"SplitExerciseResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"new_exercise_ids":{"items":{"type":"string"},"type":"array","title":"New Exercise Ids"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"},"exercises":{"items":{"$ref":"#/components/schemas/AssignmentExerciseStub"},"type":"array","title":"Exercises"},"added_exercises":{"items":{"$ref":"#/components/schemas/AssignmentExerciseStub"},"type":"array","title":"Added Exercises"},"removed_exercise_ids":{"items":{"type":"string"},"type":"array","title":"Removed Exercise Ids"}},"type":"object","required":["status","message","new_exercise_ids","updated_at","exercise_ids"],"title":"SplitExerciseResponse"},"StanislasDemoUserOutput":{"properties":{"id":{"type":"string","title":"Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"}},"type":"object","required":["id","email","image_urls"],"title":"StanislasDemoUserOutput","description":"For admin route listing only the users who did the demo."},"StanislasInput":{"properties":{"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"}},"type":"object","required":["image_urls"],"title":"StanislasInput","description":"Input model for adding images to the Stanislas doc."},"StanislasOutput":{"properties":{"id":{"type":"string","title":"Id"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"}},"type":"object","required":["id","image_urls"],"title":"StanislasOutput","description":"Response model for returning Stanislas doc data."},"StartAttemptRequest":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"auto_correct_question_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Auto Correct Question Ids"}},"type":"object","required":["assignment_id"],"title":"StartAttemptRequest","description":"Request to start a quiz attempt."},"StartSelfStudyRequest":{"properties":{"auto_correct_question_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Auto Correct Question Ids"}},"type":"object","title":"StartSelfStudyRequest","description":"Optional request body for starting a self-study attempt."},"StatusDetailItem":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"title":{"type":"string","title":"Title"},"teacher_email":{"type":"string","title":"Teacher Email"},"class_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Name"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"},"status":{"type":"string","title":"Status"}},"type":"object","required":["assignment_id","title","teacher_email","class_name","start_date","due_date","status"],"title":"StatusDetailItem"},"StatusResponse":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"StatusResponse"},"StudentAnswerSubmissionV25Context":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"assignment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id"},"submission_attempt_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Submission Attempt Index"}},"type":"object","required":["session_id","exercise_id"],"title":"StudentAnswerSubmissionV25Context"},"StudentAssignedCourseResponse":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"course_id":{"type":"string","title":"Course Id"},"course_title":{"type":"string","title":"Course Title"},"teacher_name":{"type":"string","title":"Teacher Name"},"class_name":{"type":"string","title":"Class Name"},"class_school_year":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class School Year"},"class_grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Grade"},"class_is_past":{"type":"boolean","title":"Class Is Past","default":false},"assigned_at":{"type":"string","format":"date-time","title":"Assigned At"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"sharing_options":{"$ref":"#/components/schemas/CourseComponentSharingOptions"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"}},"type":"object","required":["assignment_id","course_id","course_title","teacher_name","class_name","assigned_at","sharing_options"],"title":"StudentAssignedCourseResponse","description":"Response model for student assigned course details."},"StudentAssignmentResponse":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"title":{"type":"string","title":"Title"},"class_name":{"type":"string","title":"Class Name"},"class_school_year":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class School Year"},"class_grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Grade"},"class_is_past":{"type":"boolean","title":"Class Is Past","default":false},"teacher_name":{"type":"string","title":"Teacher Name"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"},"is_overdue":{"type":"boolean","title":"Is Overdue","default":false},"exercise_count":{"type":"integer","title":"Exercise Count"},"completed_exercises":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completed Exercises"},"progress":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress"},"progress_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress Percentage"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"performance_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Performance Score"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"}},"type":"object","required":["assignment_id","title","class_name","teacher_name","exercise_count","status","created_at","updated_at"],"title":"StudentAssignmentResponse"},"StudentAssignmentScore":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"}},"type":"object","required":["assignment_id"],"title":"StudentAssignmentScore"},"StudentBetaUpdateResponse":{"properties":{"action":{"type":"string","enum":["enable","disable"],"title":"Action"},"target_type":{"type":"string","enum":["school","email"],"title":"Target Type"},"target_value":{"type":"string","title":"Target Value"},"matched_students":{"type":"integer","title":"Matched Students"},"modified_students":{"type":"integer","title":"Modified Students"},"message":{"type":"string","title":"Message"}},"type":"object","required":["action","target_type","target_value","matched_students","modified_students","message"],"title":"StudentBetaUpdateResponse"},"StudentContactInfoBody":{"properties":{"class_id":{"type":"string","title":"Class Id"},"phone_number":{"type":"string","title":"Phone Number"}},"type":"object","required":["class_id","phone_number"],"title":"StudentContactInfoBody"},"StudentCopyViewingMetricsSummary":{"properties":{"high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High Rating Rate"},"ratings_count":{"type":"integer","title":"Ratings Count"},"category_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Category Breakdown"},"ratings_with_category":{"type":"integer","title":"Ratings With Category","default":0}},"type":"object","required":["high_rating_rate","ratings_count"],"title":"StudentCopyViewingMetricsSummary"},"StudentCopyViewingReviewItem":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"device_type":{"type":"string","title":"Device Type"},"rating":{"type":"integer","title":"Rating"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"exam_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exam Id"}},"type":"object","required":["id","created_at","device_type","rating"],"title":"StudentCopyViewingReviewItem"},"StudentCourseAccessResponse":{"properties":{"course":{"$ref":"#/components/schemas/Course"},"assignment_details":{"$ref":"#/components/schemas/StudentAssignedCourseResponse"}},"type":"object","required":["course","assignment_details"],"title":"StudentCourseAccessResponse","description":"Response model for student accessing a specific assigned course."},"StudentCourseProgress":{"properties":{"_id":{"type":"string","title":"Id"},"student_id":{"type":"string","title":"Student Id"},"course_id":{"type":"string","title":"Course Id"},"teacher_course_assignment_id":{"type":"string","title":"Teacher Course Assignment Id"},"class_id":{"type":"string","title":"Class Id"},"status":{"type":"string","enum":["not_started","in_progress","completed"],"title":"Status","default":"not_started"},"percentage_completed":{"type":"number","title":"Percentage Completed","default":0.0},"total_time_spent_seconds":{"type":"integer","title":"Total Time Spent Seconds","default":0},"last_accessed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Accessed At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"unit_progress":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Unit Progress"},"revision_flashcards_known_ids":{"items":{"type":"string"},"type":"array","title":"Revision Flashcards Known Ids"},"revision_flashcards_unknown_ids":{"items":{"type":"string"},"type":"array","title":"Revision Flashcards Unknown Ids"},"revision_sessions_count":{"type":"integer","title":"Revision Sessions Count","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["student_id","course_id","teacher_course_assignment_id","class_id"],"title":"StudentCourseProgress","description":"Model for tracking detailed student progress and interaction events for assigned courses.\nStores comprehensive data about how students engage with teacher-assigned courses."},"StudentDetails":{"properties":{"student_id":{"type":"string","title":"Student Id"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"email":{"type":"string","title":"Email"}},"type":"object","required":["student_id","full_name","email"],"title":"StudentDetails","description":"Basic student information."},"StudentDmResultsV25Context":{"properties":{"assignment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","title":"StudentDmResultsV25Context"},"StudentErrorAnalysisResponse":{"properties":{"insights":{"items":{"$ref":"#/components/schemas/ErrorInsightResponse"},"type":"array","title":"Insights"},"sessions_analyzed":{"type":"integer","title":"Sessions Analyzed"},"exercises_analyzed":{"type":"integer","title":"Exercises Analyzed"},"errors_considered":{"type":"integer","title":"Errors Considered"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"}},"type":"object","required":["insights","sessions_analyzed","exercises_analyzed","errors_considered","generated_at"],"title":"StudentErrorAnalysisResponse","description":"The synthesized recurring mistakes plus coverage metadata so the UI can\nshow what the analysis was based on. `insights` is ordered by revision\npriority — `insights[0]` is the single best use of the student's time — so\nthe UI can feature the first and show the rest in order. Empty when no errors\nwere found across the scanned first submissions."},"StudentEvaluationResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"submission_attempt_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Submission Attempt Index"},"latest_evaluation":{"anyOf":[{"$ref":"#/components/schemas/RubricEvaluationResponse"},{"type":"null"}]},"rubric":{"$ref":"#/components/schemas/RubricResponse"},"submission_photo_urls":{"items":{"type":"string"},"type":"array","title":"Submission Photo Urls"},"grading_status":{"anyOf":[{"type":"string","enum":["processing","graded","error","rejected"]},{"type":"null"}],"title":"Grading Status"},"transcription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcription"}},"type":"object","required":["session_id","exercise_id","submission_attempt_index","latest_evaluation","rubric"],"title":"StudentEvaluationResponse","description":"Returned for the student v2-evaluation GET. `latest_evaluation` is\noptional — the rubric still travels back even when the student hasn't\nsubmitted yet, so frontend surfaces can compute assignment-level totals\nover the full set of rubric'd exercises.\n\nMultimodal attempts additionally expose the submitted photos (bounding\nboxes inside the evaluation reference them by index), the grading status,\nand — V3 variant — the LLM transcription of the copy."},"StudentExam":{"properties":{"_id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"exam_title":{"type":"string","title":"Exam Title"},"time_limit":{"type":"string","title":"Time Limit"},"exam_subject_images":{"items":{"type":"string"},"type":"array","title":"Exam Subject Images","default":[]},"exam_subject_transcribed":{"type":"string","title":"Exam Subject Transcribed","default":""},"exam_started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Exam Started At"},"exam_finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Exam Finished At"},"time_spent_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Time Spent Seconds"},"student_work_images":{"items":{"type":"string"},"type":"array","title":"Student Work Images","default":[]},"student_work_diagrams":{"items":{"type":"string"},"type":"array","title":"Student Work Diagrams","default":[]},"student_work_transcribed":{"type":"string","title":"Student Work Transcribed","default":""},"correction_transcribed":{"type":"string","title":"Correction Transcribed","default":""},"performance":{"anyOf":[{"$ref":"#/components/schemas/StudentExamPerformance"},{"type":"null"}]},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback"},"structured_exercises":{"items":{"$ref":"#/components/schemas/ExamExercise"},"type":"array","title":"Structured Exercises","default":[]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"is_finished":{"type":"boolean","title":"Is Finished","default":false}},"type":"object","required":["user_id","exam_title","time_limit"],"title":"StudentExam","description":"A model for storing an exam that the student creates and works on themselves.\nThis is distinct from the teacher's exam model."},"StudentExamPerformance":{"properties":{"total_questions":{"type":"integer","title":"Total Questions"},"correct":{"type":"integer","title":"Correct"},"partial":{"type":"integer","title":"Partial"},"wrong":{"type":"integer","title":"Wrong"}},"type":"object","required":["total_questions","correct","partial","wrong"],"title":"StudentExamPerformance"},"StudentHolidayStatsResponse":{"properties":{"student_id":{"type":"string","title":"Student Id"},"student_email":{"type":"string","title":"Student Email"},"student_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Name"},"used_code_at":{"type":"string","format":"date-time","title":"Used Code At"},"total_time_spent_hours":{"type":"number","title":"Total Time Spent Hours"},"total_exercises_completed":{"type":"integer","title":"Total Exercises Completed"},"total_exercise_attempts":{"type":"integer","title":"Total Exercise Attempts"},"completion_percentage":{"type":"number","title":"Completion Percentage"},"progress_by_class":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Progress By Class"},"last_activity_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Activity At"}},"type":"object","required":["student_id","student_email","used_code_at","total_time_spent_hours","total_exercises_completed","total_exercise_attempts","completion_percentage"],"title":"StudentHolidayStatsResponse","description":"Response model for student holiday course statistics."},"StudentInboxItemsResponse":{"properties":{"review_request_verdicts":{"items":{"$ref":"#/components/schemas/StudentInboxReviewRequestVerdictItem"},"type":"array","title":"Review Request Verdicts"}},"type":"object","required":["review_request_verdicts"],"title":"StudentInboxItemsResponse"},"StudentInboxReviewRequestVerdictItem":{"properties":{"request_id":{"type":"string","title":"Request Id"},"assignment_id":{"type":"string","title":"Assignment Id"},"assignment_title":{"type":"string","title":"Assignment Title"},"session_id":{"type":"string","title":"Session Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"exercise_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Title"},"exercise_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exercise Index"},"teacher_name":{"type":"string","title":"Teacher Name"},"resolution_action":{"anyOf":[{"type":"string","enum":["corrected","marked_partial","dismissed"]},{"type":"null"}],"title":"Resolution Action"},"resolved_correctness":{"anyOf":[{"type":"string","enum":["correct","partial","wrong","not_applicable"]},{"type":"null"}],"title":"Resolved Correctness"},"resolved_at":{"type":"string","format":"date-time","title":"Resolved At"}},"type":"object","required":["request_id","assignment_id","assignment_title","session_id","exercise_id","teacher_name","resolved_at"],"title":"StudentInboxReviewRequestVerdictItem"},"StudentModeToggleResponse":{"properties":{"is_in_student_mode":{"type":"boolean","title":"Is In Student Mode"},"message":{"type":"string","title":"Message"}},"type":"object","required":["is_in_student_mode","message"],"title":"StudentModeToggleResponse"},"StudentOnboardingPerformance":{"properties":{"student":{"$ref":"#/components/schemas/StudentPerformanceSummary"},"courses":{"items":{"$ref":"#/components/schemas/CoursePerformance"},"type":"array","title":"Courses"}},"type":"object","required":["student","courses"],"title":"StudentOnboardingPerformance"},"StudentPerformanceSummary":{"properties":{"student_id":{"type":"string","title":"Student Id"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["student_id","created_at"],"title":"StudentPerformanceSummary"},"StudentPermissionResponse":{"properties":{"student_id":{"type":"string","title":"Student Id"},"permissions":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Permissions"}},"type":"object","required":["student_id","permissions"],"title":"StudentPermissionResponse"},"StudentPracticePickerMetricsSummary":{"properties":{"high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High Rating Rate"},"ratings_count":{"type":"integer","title":"Ratings Count"},"category_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Category Breakdown"},"ratings_with_category":{"type":"integer","title":"Ratings With Category","default":0},"source_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Source Breakdown"}},"type":"object","required":["high_rating_rate","ratings_count"],"title":"StudentPracticePickerMetricsSummary"},"StudentPracticePickerReviewItem":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"device_type":{"type":"string","title":"Device Type"},"rating":{"type":"integer","title":"Rating"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"prompt_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prompt Index"},"question":{"type":"string","title":"Question"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","required":["id","created_at","device_type","rating","question"],"title":"StudentPracticePickerReviewItem"},"StudentPracticePickerV1Context":{"properties":{"source":{"anyOf":[{"type":"string","enum":["recommended_session","annale_sujet","excellence_sujet","manual_picker"]},{"type":"null"}],"title":"Source"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","title":"StudentPracticePickerV1Context"},"StudentProductionResponse":{"properties":{"activity_id":{"type":"string","title":"Activity Id"},"activity_type":{"type":"string","enum":["evaluation","devoir","cours","controle"],"title":"Activity Type"},"title":{"type":"string","title":"Title"},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At"},"grade":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Grade"},"status":{"anyOf":[{"type":"string","enum":["non_rendu","absent","termine","en_cours"]},{"type":"null"}],"title":"Status"},"target_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Id"}},"type":"object","required":["activity_id","activity_type","title","occurred_at"],"title":"StudentProductionResponse","description":"Exactly one of `grade` / `status` is set. `status` distinguishes why a\nmark is missing: \"absent\" for an évaluation sat in class, \"non_rendu\" for a\nDM taken home — different problems, different conversations."},"StudentProgressInChapitre":{"properties":{"student_id":{"type":"string","title":"Student Id","description":"Student ID"},"student_name":{"type":"string","title":"Student Name","description":"Student full name"},"sub_chapitres_completed_count":{"type":"integer","title":"Sub Chapitres Completed Count","description":"Number of completed sub-chapters"},"chapitre_progress_percentage":{"type":"number","title":"Chapitre Progress Percentage","description":"Progress percentage for this chapter"},"exercises_passed_in_chapitre_count":{"type":"integer","title":"Exercises Passed In Chapitre Count","description":"Number of exercises passed in this chapter"}},"type":"object","required":["student_id","student_name","sub_chapitres_completed_count","chapitre_progress_percentage","exercises_passed_in_chapitre_count"],"title":"StudentProgressInChapitre","description":"Progress details for a specific student in a chapter."},"StudentProgressListItem":{"properties":{"student":{"$ref":"#/components/schemas/StudentDetails"},"class_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"},"class_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Name"},"status":{"type":"string","title":"Status"},"percentage_completed":{"type":"number","title":"Percentage Completed"},"total_time_spent_seconds":{"type":"integer","title":"Total Time Spent Seconds"},"last_accessed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Accessed At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"units_viewed":{"type":"integer","title":"Units Viewed"},"total_units":{"type":"integer","title":"Total Units"},"revision_sessions_count":{"type":"integer","title":"Revision Sessions Count"},"revision_flashcards_known_count":{"type":"integer","title":"Revision Flashcards Known Count","default":0},"revision_flashcards_unknown_count":{"type":"integer","title":"Revision Flashcards Unknown Count","default":0},"revision_flashcards_unknown_ids":{"items":{"type":"string"},"type":"array","title":"Revision Flashcards Unknown Ids","default":[]}},"type":"object","required":["student","status","percentage_completed","total_time_spent_seconds","last_accessed_at","started_at","completed_at","units_viewed","total_units","revision_sessions_count"],"title":"StudentProgressListItem","description":"Summary progress information for a student in a list view."},"StudentProgressionResponse":{"properties":{"student_grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Grade"},"skills_tracked":{"type":"integer","title":"Skills Tracked"},"overall_mastery":{"type":"number","title":"Overall Mastery"},"bac_date":{"type":"string","title":"Bac Date"},"skills":{"items":{"$ref":"#/components/schemas/schemas__student_progression__SkillMasteryResponse"},"type":"array","title":"Skills"},"themes":{"items":{"$ref":"#/components/schemas/ThemeMasteryResponse"},"type":"array","title":"Themes"}},"type":"object","required":["student_grade","skills_tracked","overall_mastery","bac_date","skills","themes"],"title":"StudentProgressionResponse","description":"Skill + theme mastery for the dashboard. `student_grade` is null when the\nstudent isn't classed; the frontend uses it to decide whether to show the\nbac-countdown framing. Empty `skills` means \"not enough data yet\" (the\nfrontend shows a practise-more nudge). Recurring errors come from the\nEXC-257 endpoint and are merged client-side."},"StudentQuizResult":{"properties":{"student_id":{"type":"string","title":"Student Id"},"student_name":{"type":"string","title":"Student Name"},"student_email":{"type":"string","title":"Student Email"},"best_score":{"type":"number","title":"Best Score"},"attempts_count":{"type":"integer","title":"Attempts Count"},"last_attempt_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Attempt At"},"status":{"type":"string","title":"Status"}},"type":"object","required":["student_id","student_name","student_email","best_score","attempts_count","status"],"title":"StudentQuizResult","description":"Single student's quiz results."},"StudentRecentPerformance":{"properties":{"student_id":{"type":"string","title":"Student Id"},"student_name":{"type":"string","title":"Student Name"},"scores":{"items":{"$ref":"#/components/schemas/StudentAssignmentScore"},"type":"array","title":"Scores"},"average_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Score"},"completed_count":{"type":"integer","title":"Completed Count"},"trend":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trend"}},"type":"object","required":["student_id","student_name","scores","completed_count"],"title":"StudentRecentPerformance"},"StudentRecommendationsResponse":{"properties":{"eligible":{"type":"boolean","title":"Eligible"},"subjects":{"items":{"type":"string","enum":["maths","physique-chimie"]},"type":"array","title":"Subjects"},"sessions":{"items":{"$ref":"#/components/schemas/RecommendedSessionOut"},"type":"array","title":"Sessions"}},"type":"object","required":["eligible"],"title":"StudentRecommendationsResponse","description":"`eligible=false` → the student has no exercise history yet; the\nfrontend shows the explanatory empty state (\"fais un premier exercice\nou discute avec le chat\").\n\n`subjects` lists the matières the student has history in (primary = most\nrecently worked first); `sessions` holds up to three cards, aiming at the\nthree kinds (three colors) with the matières alternating so\nevery matière with history gets at least one."},"StudentResult":{"properties":{"student_id":{"type":"string","title":"Student Id"},"student_name":{"type":"string","title":"Student Name"},"student_email":{"type":"string","title":"Student Email"},"correctness":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correctness"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback"},"image_urls_history":{"items":{"type":"string"},"type":"array","title":"Image Urls History"},"submission_blocks":{"items":{"$ref":"#/components/schemas/SolutionBlock"},"type":"array","title":"Submission Blocks"}},"type":"object","required":["student_id","student_name","student_email"],"title":"StudentResult"},"StudentRowResponse":{"properties":{"student_id":{"type":"string","title":"Student Id"},"display_name":{"type":"string","title":"Display Name"},"general":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"General"},"by_type":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"By Type","default":{}},"devoirs_done":{"type":"integer","title":"Devoirs Done"},"devoirs_assigned":{"type":"integer","title":"Devoirs Assigned"},"evaluations_done":{"type":"integer","title":"Evaluations Done"},"evaluations_assigned":{"type":"integer","title":"Evaluations Assigned"},"controles_done":{"type":"integer","title":"Controles Done"},"controles_assigned":{"type":"integer","title":"Controles Assigned"},"autonomy_exercises":{"type":"integer","title":"Autonomy Exercises"},"last_activity":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Activity"},"flag":{"anyOf":[{"type":"string","enum":["never","stale"]},{"type":"null"}],"title":"Flag"}},"type":"object","required":["student_id","display_name","devoirs_done","devoirs_assigned","evaluations_done","evaluations_assigned","controles_done","controles_assigned","autonomy_exercises"],"title":"StudentRowResponse","description":"`flag` is null for a student with nothing wrong. \"never\" and \"stale\" are\nnot a severity scale — one is an onboarding problem, the other a\npedagogical one — so the UI colours them differently."},"StudentSessionBreakdownResponse":{"properties":{"student_id":{"type":"string","title":"Student Id"},"breakdown":{"$ref":"#/components/schemas/SessionGradeBreakdownResponse"}},"type":"object","required":["student_id","breakdown"],"title":"StudentSessionBreakdownResponse"},"StudentSessionDetails":{"properties":{"session_id":{"type":"string","title":"Session Id"},"student_id":{"type":"string","title":"Student Id"},"student_name":{"type":"string","title":"Student Name"},"student_email":{"type":"string","title":"Student Email"},"class_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"},"progress":{"type":"string","title":"Progress"},"progress_percentage":{"type":"number","title":"Progress Percentage"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"correct_count":{"type":"integer","title":"Correct Count","default":0},"partial_count":{"type":"integer","title":"Partial Count","default":0},"wrong_count":{"type":"integer","title":"Wrong Count","default":0},"performance_score":{"type":"number","title":"Performance Score","default":0},"has_started":{"type":"boolean","title":"Has Started","default":true},"completion_status":{"type":"string","enum":["not_started","in_progress","completed"],"title":"Completion Status"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"duration_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Minutes"},"exercise_scores":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Exercise Scores"}},"type":"object","required":["session_id","student_id","student_name","student_email","progress","progress_percentage","updated_at","completion_status"],"title":"StudentSessionDetails"},"StudentSheetResponse":{"properties":{"student_id":{"type":"string","title":"Student Id"},"display_name":{"type":"string","title":"Display Name"},"class_name":{"type":"string","title":"Class Name"},"period":{"type":"string","title":"Period"},"general":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"General"},"by_type":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"By Type","default":{}},"class_general":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Class General"},"class_by_type":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Class By Type","default":{}},"devoirs_done":{"type":"integer","title":"Devoirs Done"},"devoirs_assigned":{"type":"integer","title":"Devoirs Assigned"},"controles_done":{"type":"integer","title":"Controles Done"},"controles_assigned":{"type":"integer","title":"Controles Assigned"},"autonomy_exercises":{"type":"integer","title":"Autonomy Exercises"},"last_activity":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Activity"},"productions":{"items":{"$ref":"#/components/schemas/StudentProductionResponse"},"type":"array","title":"Productions"},"profile":{"items":{"$ref":"#/components/schemas/ChapterProfilePointResponse"},"type":"array","title":"Profile"},"has_radar":{"type":"boolean","title":"Has Radar"},"evaluated_chapters":{"type":"integer","title":"Evaluated Chapters"},"total_chapters":{"type":"integer","title":"Total Chapters"},"weights":{"additionalProperties":{"type":"number"},"type":"object","title":"Weights"}},"type":"object","required":["student_id","display_name","class_name","period","devoirs_done","devoirs_assigned","controles_done","controles_assigned","autonomy_exercises","productions","profile","has_radar","evaluated_chapters","total_chapters","weights"],"title":"StudentSheetResponse","description":"`has_radar` is sent rather than left to the client to infer: whether\nthree axes are enough to draw a shape is a display rule, and computing it\nin two places is how the caption and the chart end up disagreeing."},"StudentStats":{"properties":{"active":{"type":"integer","title":"Active"},"registered":{"type":"integer","title":"Registered"},"total":{"type":"integer","title":"Total"},"total_available":{"type":"boolean","title":"Total Available"},"active_percentage":{"type":"number","title":"Active Percentage"}},"type":"object","required":["active","registered","total","total_available","active_percentage"],"title":"StudentStats"},"StudentUSOut":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"type":"string","title":"Full Name"},"next_sessions":{"items":{"type":"string"},"type":"array","title":"Next Sessions"},"prev_sessions":{"items":{"type":"string"},"type":"array","title":"Prev Sessions"},"topics_done":{"items":{"type":"string"},"type":"array","title":"Topics Done"}},"type":"object","required":["id","email","full_name"],"title":"StudentUSOut","description":"Public info about a StudentUS."},"SubChapitreCreate":{"properties":{"name":{"type":"string","minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order","default":0}},"type":"object","required":["name"],"title":"SubChapitreCreate","description":"Request model for creating a holiday course sub-chapitre"},"SubChapitreResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"chapitre_id":{"type":"string","title":"Chapitre Id"},"order":{"type":"integer","title":"Order"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"course_content_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Course Content Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","chapitre_id","order","created_at","updated_at"],"title":"SubChapitreResponse","description":"Response model for holiday course sub-chapitre"},"SubChapitreUpdate":{"properties":{"name":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order"},"course_content_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Course Content Id"}},"type":"object","title":"SubChapitreUpdate","description":"Request model for updating a holiday course sub-chapitre"},"SubChapitreWithDetails":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"chapitre_id":{"type":"string","title":"Chapitre Id"},"order":{"type":"integer","title":"Order"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"course_content_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Course Content Id"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"student_progress_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Progress Status","default":"not_started"},"content_fully_viewed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Content Fully Viewed","default":false},"total_exercise_count":{"type":"integer","title":"Total Exercise Count","default":0}},"type":"object","required":["id","name","chapitre_id","order","created_at","updated_at"],"title":"SubChapitreWithDetails","description":"Enhanced response model that includes exercise count information."},"SubChapitreWithProgress":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"chapitre_id":{"type":"string","title":"Chapitre Id"},"order":{"type":"integer","title":"Order"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"course_content_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Course Content Id"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"student_progress_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Student Progress Status","default":"not_started"},"content_fully_viewed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Content Fully Viewed","default":false}},"type":"object","required":["id","name","chapitre_id","order","created_at","updated_at"],"title":"SubChapitreWithProgress","description":"Response model that extends HolidayCourseSubChapitre with student progress information."},"SubjectOut":{"properties":{"key":{"type":"string","enum":["maths","physique-chimie"],"title":"Key"},"label":{"type":"string","title":"Label"},"short_label":{"type":"string","title":"Short Label"},"color":{"type":"string","title":"Color"},"order":{"type":"integer","title":"Order"}},"type":"object","required":["key","label","short_label","color","order"],"title":"SubjectOut"},"SubmitAnswerRequest":{"properties":{"question_id":{"type":"string","title":"Question Id"},"selected_answer_index":{"type":"integer","title":"Selected Answer Index"}},"type":"object","required":["question_id","selected_answer_index"],"title":"SubmitAnswerRequest","description":"Request to submit an answer for a question."},"SubmitAnswerResponse":{"properties":{"is_correct":{"type":"boolean","title":"Is Correct"},"correct_answer_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Correct Answer Index"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation"}},"type":"object","required":["is_correct"],"title":"SubmitAnswerResponse","description":"Response after submitting an answer."},"SubmitCopyBody":{"properties":{"ordered_image_urls":{"items":{"type":"string"},"type":"array","title":"Ordered Image Urls"}},"type":"object","required":["ordered_image_urls"],"title":"SubmitCopyBody"},"SubmitOpenAnswerRequest":{"properties":{"question_id":{"type":"string","title":"Question Id"},"photo_urls":{"items":{"type":"string"},"type":"array","maxItems":12,"minItems":1,"title":"Photo Urls"}},"type":"object","required":["question_id","photo_urls"],"title":"SubmitOpenAnswerRequest","description":"Request to submit a photographed answer for an open question."},"SubmitScoreBody":{"properties":{"board_size":{"type":"integer","title":"Board Size"},"time_seconds":{"type":"number","title":"Time Seconds"}},"type":"object","required":["board_size","time_seconds"],"title":"SubmitScoreBody"},"SubmittedOnboardingContextData":{"properties":{"level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"math_confidence":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Math Confidence"},"current_results_slider_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Results Slider Value"},"current_results_perception":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Results Perception"},"motivation_level_slider_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Motivation Level Slider Value"},"interests_main":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Interests Main"},"interests_sub_choices":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Interests Sub Choices"},"motivation_reasons":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Motivation Reasons"},"study_hours_daily_goal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Study Hours Daily Goal"},"notification_preference_choice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Preference Choice"},"class_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Code"},"pending_student_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Student Id"}},"type":"object","title":"SubmittedOnboardingContextData"},"SuggestedExercisesResponse":{"properties":{"eligible":{"type":"boolean","title":"Eligible"},"suggestions":{"items":{"$ref":"#/components/schemas/PublicExerciseOut"},"type":"array","title":"Suggestions"}},"type":"object","required":["eligible","suggestions"],"title":"SuggestedExercisesResponse","description":"Response shape for `GET /teacher-analytics/suggested-exercises`.\n\n`eligible` lets the frontend distinguish two \"empty suggestions\"\nreasons:\n  - `eligible=false, suggestions=[]` → teacher hasn't assigned enough\n    yet; show \"first use\" copy.\n  - `eligible=true,  suggestions=[]` → no good matches found for the\n    current context; show \"no matches, try widening filters\" copy."},"SystemSetting":{"properties":{"key":{"type":"string","title":"Key"},"value":{"type":"string","title":"Value"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["key","value"],"title":"SystemSetting"},"SystemSettingResponse":{"properties":{"key":{"type":"string","title":"Key"},"value":{"type":"string","title":"Value"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["key","value"],"title":"SystemSettingResponse"},"TableauCell":{"properties":{"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"left_limit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Left Limit"},"right_limit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Right Limit"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"additionalProperties":false,"type":"object","title":"TableauCell"},"TableauColumn":{"properties":{"left_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Left Endpoint"},"right_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Right Endpoint"},"separator_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Separator Value"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"}},"additionalProperties":false,"type":"object","title":"TableauColumn"},"TableauPayload":{"properties":{"version":{"type":"integer","title":"Version","default":1},"columns":{"items":{"$ref":"#/components/schemas/TableauColumn"},"type":"array","title":"Columns"},"rows":{"items":{"$ref":"#/components/schemas/TableauRow"},"type":"array","title":"Rows"},"cells":{"additionalProperties":{"items":{"$ref":"#/components/schemas/TableauCell"},"type":"array"},"type":"object","title":"Cells"},"variable_name":{"type":"string","title":"Variable Name","default":"x"}},"additionalProperties":false,"type":"object","required":["columns","rows"],"title":"TableauPayload"},"TableauRow":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"line_type":{"type":"string","enum":["signes","variations"],"title":"Line Type","default":"signes"}},"additionalProperties":false,"type":"object","required":["id","name"],"title":"TableauRow"},"TeacherAccessStatusResponse":{"properties":{"status":{"type":"string","enum":["school","trial","read_only"],"title":"Status"},"is_read_only":{"type":"boolean","title":"Is Read Only"},"access_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Access Until"},"days_left":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Left"},"school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Name"},"read_only_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Read Only Reason"}},"type":"object","required":["status","is_read_only"],"title":"TeacherAccessStatusResponse"},"TeacherApprovalResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"is_approved":{"type":"boolean","title":"Is Approved"},"is_active":{"type":"boolean","title":"Is Active"},"establishment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Establishment"},"is_rejected":{"type":"boolean","title":"Is Rejected"}},"type":"object","required":["id","email","full_name","created_at","country","phone_number","is_approved","is_active","establishment","is_rejected"],"title":"TeacherApprovalResponse","description":"Response model for teacher approval data."},"TeacherApprovalsListResponse":{"properties":{"teachers":{"items":{"$ref":"#/components/schemas/TeacherApprovalResponse"},"type":"array","title":"Teachers"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["teachers","total"],"title":"TeacherApprovalsListResponse","description":"Response model for teacher approvals list."},"TeacherAssignmentChatExerciseItem":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"statement":{"type":"string","title":"Statement"},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution"},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"solution_figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Figure Id"}},"type":"object","required":["statement"],"title":"TeacherAssignmentChatExerciseItem","description":"One exercise proposed by the chat 'nouveau devoir' attachment: full\nénoncé + optional corrigé and Figure doc ids (figures are created by the\nfrontend via POST /figures/ before this endpoint is called, mirroring the\n<add_exercise_attachment> apply flow)."},"TeacherAssignmentCreate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"class_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"},"class_ids":{"items":{"type":"string"},"type":"array","title":"Class Ids"},"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"},"randomize_order":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Randomize Order","default":true}},"type":"object","title":"TeacherAssignmentCreate"},"TeacherAssignmentFromChatAttachmentCreate":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"exercises":{"items":{"anyOf":[{"$ref":"#/components/schemas/TeacherAssignmentChatExerciseItem"},{"type":"string"}]},"type":"array","title":"Exercises"}},"type":"object","required":["chat_id"],"title":"TeacherAssignmentFromChatAttachmentCreate"},"TeacherAssignmentFromChatAttachmentResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"assignment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id"},"created":{"type":"boolean","title":"Created"}},"type":"object","required":["status","message","created"],"title":"TeacherAssignmentFromChatAttachmentResponse"},"TeacherAssignmentResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"},"grade":{"anyOf":[{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},{"type":"null"}],"title":"Grade"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"class_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Id"},"class_ids":{"items":{"type":"string"},"type":"array","title":"Class Ids"},"teacher_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Id"},"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"},"status":{"type":"string","enum":["draft","active","finished"],"title":"Status","default":"draft"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"},"class_schedules":{"items":{"$ref":"#/components/schemas/AssignmentClassScheduleOut"},"type":"array","title":"Class Schedules"},"binary_grading":{"type":"boolean","title":"Binary Grading","default":false},"randomize_order":{"type":"boolean","title":"Randomize Order","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"student_count":{"type":"integer","title":"Student Count"},"pending_review_request_count":{"type":"integer","title":"Pending Review Request Count","default":0},"chat_policy":{"additionalProperties":{"type":"string"},"type":"object","title":"Chat Policy"},"chat_scoring_policy":{"additionalProperties":{"type":"integer"},"type":"object","title":"Chat Scoring Policy"},"retry_policy":{"additionalProperties":{"type":"integer"},"type":"object","title":"Retry Policy"}},"type":"object","required":["id","title","exercise_ids","created_at","updated_at","student_count"],"title":"TeacherAssignmentResponse"},"TeacherAssignmentUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"exercise_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exercise Ids"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"},"binary_grading":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Binary Grading"},"randomize_order":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Randomize Order"},"chat_policy":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Chat Policy"},"chat_scoring_policy":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Chat Scoring Policy"},"retry_policy":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Retry Policy"},"justification_required":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"title":"Justification Required"}},"type":"object","title":"TeacherAssignmentUpdate"},"TeacherBreakdown":{"properties":{"teacher_email":{"type":"string","title":"Teacher Email"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["teacher_email","count"],"title":"TeacherBreakdown"},"TeacherCategoryNode":{"properties":{"name":{"type":"string","title":"Name"},"path":{"items":{"type":"string"},"type":"array","title":"Path"},"exercise_count":{"type":"integer","title":"Exercise Count"},"children":{"items":{"$ref":"#/components/schemas/TeacherCategoryNode"},"type":"array","title":"Children"}},"type":"object","required":["name","path","exercise_count"],"title":"TeacherCategoryNode"},"TeacherCourseDetail":{"properties":{"id":{"type":"string","title":"Id"},"teacher_id":{"type":"string","title":"Teacher Id"},"teacher_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Email"},"title":{"type":"string","title":"Title"},"status":{"type":"string","title":"Status"},"is_teacher_course":{"type":"boolean","title":"Is Teacher Course"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"has_raw_content":{"type":"boolean","title":"Has Raw Content"},"has_units":{"type":"boolean","title":"Has Units"},"has_original_images":{"type":"boolean","title":"Has Original Images"},"unit_count":{"type":"integer","title":"Unit Count"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"warnings":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Warnings"},"processing_options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Processing Options"},"original_image_paths":{"items":{"type":"string"},"type":"array","title":"Original Image Paths"},"raw_content_blob":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Content Blob"},"units":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Units"}},"type":"object","required":["id","teacher_id","title","status","is_teacher_course","created_at","updated_at","has_raw_content","has_units","has_original_images","unit_count","original_image_paths","units"],"title":"TeacherCourseDetail","description":"Detailed information for a teacher course"},"TeacherCourseStatus":{"properties":{"id":{"type":"string","title":"Id"},"teacher_id":{"type":"string","title":"Teacher Id"},"teacher_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Email"},"title":{"type":"string","title":"Title"},"status":{"type":"string","title":"Status"},"is_teacher_course":{"type":"boolean","title":"Is Teacher Course"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"has_raw_content":{"type":"boolean","title":"Has Raw Content"},"has_units":{"type":"boolean","title":"Has Units"},"has_original_images":{"type":"boolean","title":"Has Original Images"},"unit_count":{"type":"integer","title":"Unit Count"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"warnings":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Warnings"},"processing_options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Processing Options"}},"type":"object","required":["id","teacher_id","title","status","is_teacher_course","created_at","updated_at","has_raw_content","has_units","has_original_images","unit_count"],"title":"TeacherCourseStatus","description":"Status information for a teacher course"},"TeacherCoursesListResponse":{"properties":{"courses":{"items":{"$ref":"#/components/schemas/TeacherCourseStatus"},"type":"array","title":"Courses"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["courses","total","page","page_size"],"title":"TeacherCoursesListResponse","description":"Response for listing teacher courses"},"TeacherDmResultsV25Context":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"total_students":{"type":"integer","title":"Total Students"},"submitted_students":{"type":"integer","title":"Submitted Students"}},"type":"object","required":["assignment_id","total_students","submitted_students"],"title":"TeacherDmResultsV25Context"},"TeacherEmailExportResponse":{"properties":{"count":{"type":"integer","title":"Count"},"sample_emails":{"items":{"type":"string"},"type":"array","title":"Sample Emails"},"sample":{"items":{"$ref":"#/components/schemas/TeacherEmailSampleItem"},"type":"array","title":"Sample","default":[]}},"type":"object","required":["count","sample_emails"],"title":"TeacherEmailExportResponse","description":"Response model for teacher email export preview"},"TeacherEmailSampleItem":{"properties":{"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"school":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School"}},"type":"object","required":["email"],"title":"TeacherEmailSampleItem","description":"Sample item for teacher email export preview"},"TeacherEstablishmentResponse":{"properties":{"establishment":{"type":"string","title":"Establishment"},"school_affiliation_status":{"type":"string","title":"School Affiliation Status"}},"type":"object","required":["establishment","school_affiliation_status"],"title":"TeacherEstablishmentResponse"},"TeacherEstablishmentUpdate":{"properties":{"establishment":{"type":"string","minLength":2,"title":"Establishment"},"french_school_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"French School Id"},"french_school_uai":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"French School Uai"},"is_custom_school":{"type":"boolean","title":"Is Custom School","default":false},"custom_school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom School Name"},"custom_school_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom School City"}},"type":"object","required":["establishment"],"title":"TeacherEstablishmentUpdate","description":"Establishment (re)declared outside onboarding (teachers asked again)."},"TeacherExamsResponse":{"properties":{"status":{"type":"string","title":"Status"},"exams":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Exams"}},"type":"object","required":["status","exams"],"title":"TeacherExamsResponse"},"TeacherExerciseCreateRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"type":"string","title":"Content"},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution"},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"solution_figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Figure Id"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"themes":{"items":{"type":"string"},"type":"array","title":"Themes"},"grade":{"anyOf":[{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},{"type":"null"}],"title":"Grade"},"is_private":{"type":"boolean","title":"Is Private","default":true},"is_saved":{"type":"boolean","title":"Is Saved","default":false},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},"type":"object","required":["content"],"title":"TeacherExerciseCreateRequest"},"TeacherExerciseEditRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution"},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"solution_figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Figure Id"},"figure_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Solution"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"themes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Themes"},"edit_method":{"type":"string","title":"Edit Method","default":"latex"}},"type":"object","title":"TeacherExerciseEditRequest","description":"Request model for editing exercise content with versioning."},"TeacherExerciseHistoryEntry":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"library":{"type":"string","enum":["excellence","calcul","annales"],"title":"Library"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Preview"},"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"last_given_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Given At"},"times_given":{"type":"integer","title":"Times Given","default":0},"assignment_titles":{"items":{"type":"string"},"type":"array","title":"Assignment Titles"}},"type":"object","required":["exercise_id","library"],"title":"TeacherExerciseHistoryEntry","description":"One distinct library exercise the teacher has already given.\n\n`exercise_id` is the LIBRARY id (`public_exercises` /\n`calcul_exercise_templates` / `annales_exercises` `_id`) — i.e. the id\nthe picker cards carry — never the per-assignment `teacher_exercises`\ncopy id."},"TeacherExerciseResponse":{"properties":{"id":{"type":"string","title":"Id"},"teacher_id":{"type":"string","title":"Teacher Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"type":"string","title":"Content"},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution"},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"solution_figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Figure Id"},"figure_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Content"},"figure_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Solution"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"themes":{"items":{"type":"string"},"type":"array","title":"Themes"},"source":{"type":"string","title":"Source"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"},"grade":{"anyOf":[{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},{"type":"null"}],"title":"Grade"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"is_private":{"type":"boolean","title":"Is Private"},"is_saved":{"type":"boolean","title":"Is Saved"},"school_year":{"type":"string","title":"School Year"},"is_past":{"type":"boolean","title":"Is Past","default":false},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"likes_count":{"type":"integer","title":"Likes Count","default":0}},"type":"object","required":["id","teacher_id","title","content","solution","difficulty","themes","source","created_at","updated_at","is_private","is_saved","school_year"],"title":"TeacherExerciseResponse"},"TeacherExerciseUpdateRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution"},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"solution_figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Figure Id"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"themes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Themes"},"is_private":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Private"},"is_saved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Saved"}},"type":"object","title":"TeacherExerciseUpdateRequest"},"TeacherFavoriteCreate":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"exercise_type":{"type":"string","enum":["public","teacher"],"title":"Exercise Type"}},"type":"object","required":["exercise_id","exercise_type"],"title":"TeacherFavoriteCreate"},"TeacherFavoriteOut":{"properties":{"id":{"type":"string","title":"Id"},"teacher_id":{"type":"string","title":"Teacher Id"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"},"public_exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Exercise Id"},"teacher_exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Exercise Id"},"target_type":{"type":"string","enum":["public","teacher"],"title":"Target Type"},"added_at":{"type":"string","format":"date-time","title":"Added At"}},"type":"object","required":["id","teacher_id","target_type","added_at"],"title":"TeacherFavoriteOut","description":"Favorite document, with origin already resolved.\n\n`target_type` indicates which of the two FK fields is populated so the\nfrontend doesn't have to re-check both."},"TeacherFavoriteWithDetails":{"properties":{"id":{"type":"string","title":"Id"},"teacher_id":{"type":"string","title":"Teacher Id"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"},"public_exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Exercise Id"},"teacher_exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Exercise Id"},"target_type":{"type":"string","enum":["public","teacher"],"title":"Target Type"},"added_at":{"type":"string","format":"date-time","title":"Added At"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Preview"},"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"library":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Library"}},"type":"object","required":["id","teacher_id","target_type","added_at"],"title":"TeacherFavoriteWithDetails","description":"Same as `TeacherFavoriteOut`, plus a resolved exercise preview.\n\nReturned by `GET /teacher-favorites` to save the frontend a round-trip.\n`content_preview` is a short slice of the énoncé; full content is\navailable via the underlying `/public-exercises/{id}` /\n`/teacher_exercises/{id}` endpoints."},"TeacherFunnelStep":{"properties":{"step":{"type":"string","title":"Step"},"label":{"type":"string","title":"Label"},"count":{"type":"integer","title":"Count"},"percentage":{"type":"number","title":"Percentage"}},"type":"object","required":["step","label","count","percentage"],"title":"TeacherFunnelStep","description":"Model for a single funnel step."},"TeacherInboxCopyGradingFinishedItem":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exam_id":{"type":"string","title":"Exam Id"},"exam_title":{"type":"string","title":"Exam Title"},"copy_count":{"type":"integer","title":"Copy Count"},"completed_at":{"type":"string","format":"date-time","title":"Completed At"}},"type":"object","required":["session_id","exam_id","exam_title","copy_count","completed_at"],"title":"TeacherInboxCopyGradingFinishedItem"},"TeacherInboxFinishedAssignmentItem":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"assignment_title":{"type":"string","title":"Assignment Title"},"due_date":{"type":"string","format":"date-time","title":"Due Date"},"class_names":{"items":{"type":"string"},"type":"array","title":"Class Names"}},"type":"object","required":["assignment_id","assignment_title","due_date"],"title":"TeacherInboxFinishedAssignmentItem"},"TeacherInboxItemsResponse":{"properties":{"review_requests":{"items":{"$ref":"#/components/schemas/TeacherInboxReviewRequestItem"},"type":"array","title":"Review Requests"},"finished_assignments":{"items":{"$ref":"#/components/schemas/TeacherInboxFinishedAssignmentItem"},"type":"array","title":"Finished Assignments"},"copy_grading_finished":{"items":{"$ref":"#/components/schemas/TeacherInboxCopyGradingFinishedItem"},"type":"array","title":"Copy Grading Finished"}},"type":"object","required":["review_requests","finished_assignments","copy_grading_finished"],"title":"TeacherInboxItemsResponse"},"TeacherInboxReviewRequestItem":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id"},"assignment_title":{"type":"string","title":"Assignment Title"},"pending_count":{"type":"integer","title":"Pending Count"},"latest_request_at":{"type":"string","format":"date-time","title":"Latest Request At"},"class_names":{"items":{"type":"string"},"type":"array","title":"Class Names"}},"type":"object","required":["assignment_id","assignment_title","pending_count","latest_request_at"],"title":"TeacherInboxReviewRequestItem"},"TeacherInvitationCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"}},"type":"object","required":["email"],"title":"TeacherInvitationCreate"},"TeacherInvitationListResponse":{"properties":{"invitations":{"items":{"$ref":"#/components/schemas/TeacherInvitationResponse"},"type":"array","title":"Invitations"}},"type":"object","required":["invitations"],"title":"TeacherInvitationListResponse"},"TeacherInvitationResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject","default":"maths"},"school_id":{"type":"string","title":"School Id"},"status":{"type":"string","enum":["pending","accepted","expired"],"title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"accepted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Accepted At"}},"type":"object","required":["id","email","school_id","status","created_at","expires_at"],"title":"TeacherInvitationResponse"},"TeacherInvitationSendResponse":{"properties":{"invitation":{"$ref":"#/components/schemas/TeacherInvitationResponse"},"email_sent":{"type":"boolean","title":"Email Sent"}},"type":"object","required":["invitation","email_sent"],"title":"TeacherInvitationSendResponse"},"TeacherMetricsResponse":{"properties":{"funnel":{"items":{"$ref":"#/components/schemas/TeacherFunnelStep"},"type":"array","title":"Funnel"},"median_validation_wait_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Validation Wait Hours"},"p95_validation_wait_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Validation Wait Hours"},"median_first_assignment_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median First Assignment Hours"},"p95_first_assignment_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 First Assignment Hours"},"total_teachers_registered":{"type":"integer","title":"Total Teachers Registered"},"total_teachers_validated":{"type":"integer","title":"Total Teachers Validated"},"total_teachers_with_assignment":{"type":"integer","title":"Total Teachers With Assignment"}},"type":"object","required":["funnel","median_validation_wait_hours","p95_validation_wait_hours","median_first_assignment_hours","p95_first_assignment_hours","total_teachers_registered","total_teachers_validated","total_teachers_with_assignment"],"title":"TeacherMetricsResponse","description":"Response model for teacher activation metrics."},"TeacherPDFPreferencesUpdate":{"properties":{"default_teacher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Teacher Name"},"default_school_logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default School Logo Url"},"default_class_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Class Name"},"default_duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Duration"},"default_general_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default General Instructions"},"default_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Template"},"default_font_family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Font Family"},"default_font_size":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Default Font Size"},"default_line_spacing":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Default Line Spacing"},"default_include_header":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Default Include Header"}},"type":"object","title":"TeacherPDFPreferencesUpdate"},"TeacherPhysicsLibraryV1Context":{"properties":{"surface":{"type":"string","enum":["teacher_assignment","teacher_exam","teacher_exercise_library","teacher_exercise_detail"],"title":"Surface"},"action":{"type":"string","enum":["confirmed","dismissed"],"title":"Action"},"selection_count":{"type":"integer","minimum":0.0,"title":"Selection Count"}},"type":"object","required":["surface","action","selection_count"],"title":"TeacherPhysicsLibraryV1Context"},"TeacherSchoolResponse":{"properties":{"school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Name"},"has_school":{"type":"boolean","title":"Has School","default":false}},"type":"object","title":"TeacherSchoolResponse","description":"Response model for teacher's school information"},"TeacherStats":{"properties":{"active":{"type":"integer","title":"Active"},"registered":{"type":"integer","title":"Registered"},"total":{"type":"integer","title":"Total"},"total_available":{"type":"boolean","title":"Total Available"},"active_percentage":{"type":"number","title":"Active Percentage"}},"type":"object","required":["active","registered","total","total_available","active_percentage"],"title":"TeacherStats"},"TeacherTableRow":{"properties":{"teacher_id":{"type":"string","title":"Teacher Id"},"teacher_name":{"type":"string","title":"Teacher Name"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"class_count":{"type":"integer","title":"Class Count"},"is_active_7d":{"type":"boolean","title":"Is Active 7D"},"student_active_percentage":{"type":"number","title":"Student Active Percentage"},"assignments_created":{"type":"integer","title":"Assignments Created"},"exercises_created":{"type":"integer","title":"Exercises Created"},"exams_created":{"type":"integer","title":"Exams Created"},"courses_created":{"type":"integer","title":"Courses Created"},"school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Name"}},"type":"object","required":["teacher_id","teacher_name","class_count","is_active_7d","student_active_percentage","assignments_created","exercises_created","exams_created","courses_created"],"title":"TeacherTableRow"},"TeacherTranscriptionLatencyPayload":{"properties":{"context_type":{"type":"string","enum":["teacher_exam_subject","teacher_exam_upload","assignment_quick_upload","teacher_exercise_photo"],"title":"Context Type"},"context_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context Id"},"perceived_velocity_ms":{"type":"number","title":"Perceived Velocity Ms"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"transcriptions":{"items":{"type":"string"},"type":"array","title":"Transcriptions"},"image_count":{"type":"integer","title":"Image Count"},"device_type":{"type":"string","title":"Device Type"},"assignment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id"}},"type":"object","required":["context_type","perceived_velocity_ms","image_urls","image_count","device_type"],"title":"TeacherTranscriptionLatencyPayload"},"TeacherVerificationStatus":{"properties":{"account_email_is_academic":{"type":"boolean","title":"Account Email Is Academic"},"academic_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Academic Email"},"academic_email_verified":{"type":"boolean","title":"Academic Email Verified"},"verification_email_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Verification Email Sent At"}},"type":"object","required":["account_email_is_academic","academic_email","academic_email_verified","verification_email_sent_at"],"title":"TeacherVerificationStatus"},"TemplateInput":{"properties":{"title":{"type":"string","title":"Title","description":"Title of the template"},"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path","description":"Category path, e.g., ['6e', 'Calcul', 'Mental']"},"difficulty":{"type":"string","title":"Difficulty","description":"Difficulty: easy, medium, or hard"},"savoirs_faire_ids":{"items":{"type":"string"},"type":"array","title":"Savoirs Faire Ids"}},"type":"object","required":["title","category_path","difficulty"],"title":"TemplateInput","description":"Input model for creating a template"},"TemplateSummary":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"difficulty":{"type":"string","title":"Difficulty"},"to_review":{"type":"boolean","title":"To Review","default":false},"variation_count":{"type":"integer","title":"Variation Count"},"savoirs_faire_ids":{"items":{"type":"string"},"type":"array","title":"Savoirs Faire Ids"}},"type":"object","required":["id","title","difficulty","variation_count"],"title":"TemplateSummary","description":"Lightweight template info without example (loaded on demand)"},"TemplateTreeNode":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path"},"difficulty":{"type":"string","title":"Difficulty"},"to_review":{"type":"boolean","title":"To Review","default":false},"variation_count":{"type":"integer","title":"Variation Count"},"example_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Example Content"},"savoirs_faire_ids":{"items":{"type":"string"},"type":"array","title":"Savoirs Faire Ids"}},"type":"object","required":["id","title","category_path","difficulty","variation_count"],"title":"TemplateTreeNode","description":"Tree node for displaying templates in a hierarchy"},"TemplateUpdateInput":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"category_path":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Category Path"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"to_review":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"To Review"},"savoirs_faire_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Savoirs Faire Ids"}},"type":"object","title":"TemplateUpdateInput","description":"Input model for updating a template.\n\nPartial update — fields left as `None` are untouched. `savoirs_faire_ids`\nuses a *set* semantic when provided (the full list wins), so clearing all\ntags is `{savoirs_faire_ids: []}` (not omitting it)."},"TemplateWithVariations":{"properties":{"title":{"type":"string","title":"Title"},"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path"},"difficulty":{"type":"string","title":"Difficulty","default":"medium"},"variations":{"items":{"$ref":"#/components/schemas/VariationInput"},"type":"array","title":"Variations"},"savoirs_faire_ids":{"items":{"type":"string"},"type":"array","title":"Savoirs Faire Ids"}},"type":"object","required":["title","category_path","variations"],"title":"TemplateWithVariations","description":"Input model for batch import with variations"},"TexImportRequest":{"properties":{"tex_content":{"type":"string","title":"Tex Content"}},"type":"object","required":["tex_content"],"title":"TexImportRequest","description":"Request model for importing exercises from LaTeX content"},"TexImportResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"created_exercises_count":{"type":"integer","title":"Created Exercises Count","default":0},"processed_exercises":{"items":{"$ref":"#/components/schemas/ProcessedExercise"},"type":"array","title":"Processed Exercises","default":[]},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","default":[]}},"type":"object","required":["status","message"],"title":"TexImportResponse","description":"Response model for LaTeX import operation"},"TextExerciseRequest":{"properties":{"prompt":{"type":"string","title":"Prompt"}},"type":"object","required":["prompt"],"title":"TextExerciseRequest"},"TextSpan":{"properties":{"block_id":{"type":"string","title":"Block Id"},"start":{"type":"integer","title":"Start"},"end":{"type":"integer","title":"End"}},"type":"object","required":["block_id","start","end"],"title":"TextSpan","description":"Resolved char offsets into a `SubmissionAttempt.solution_blocks[i].transcribed_text`.\nBackend computes start/end at write time."},"Thematic":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"sort_order":{"type":"integer","title":"Sort Order","default":0}},"type":"object","required":["key","label"],"title":"Thematic"},"ThematicInput":{"properties":{"key":{"type":"string","minLength":1,"title":"Key"},"label":{"type":"string","minLength":1,"title":"Label"},"sort_order":{"type":"integer","title":"Sort Order","default":0}},"type":"object","required":["key","label"],"title":"ThematicInput"},"ThemeMasteryResponse":{"properties":{"chapter":{"type":"string","title":"Chapter"},"mastery":{"type":"number","title":"Mastery"},"skills_count":{"type":"integer","title":"Skills Count"}},"type":"object","required":["chapter","mastery","skills_count"],"title":"ThemeMasteryResponse"},"TimeSeriesData":{"properties":{"module":{"type":"string","title":"Module"},"period":{"type":"string","title":"Period"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["module","period","count"],"title":"TimeSeriesData"},"TitleUpdateRequest":{"properties":{"title":{"type":"string","title":"Title"}},"type":"object","required":["title"],"title":"TitleUpdateRequest"},"ToAttachListResponse":{"properties":{"teachers":{"items":{"$ref":"#/components/schemas/ToAttachTeacher"},"type":"array","title":"Teachers"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["teachers","total"],"title":"ToAttachListResponse"},"ToAttachTeacher":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_visit_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Visit At"},"establishment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Establishment"},"is_custom_school":{"type":"boolean","title":"Is Custom School","default":false},"custom_school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom School Name"},"custom_school_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom School City"},"academic_email_verified":{"type":"boolean","title":"Academic Email Verified","default":false},"status":{"type":"string","enum":["no_b2b","pending_review"],"title":"Status"},"french_school":{"anyOf":[{"$ref":"#/components/schemas/FrenchSchoolSummary"},{"type":"null"}]},"hints":{"$ref":"#/components/schemas/AttachmentHints"}},"type":"object","required":["id","email","full_name","created_at","status","hints"],"title":"ToAttachTeacher"},"ToggleDiagramRequest":{"properties":{"image_url":{"type":"string","title":"Image Url"}},"type":"object","required":["image_url"],"title":"ToggleDiagramRequest"},"ToggleSingleUseRequest":{"properties":{"use_single_codes":{"type":"boolean","title":"Use Single Codes"}},"type":"object","required":["use_single_codes"],"title":"ToggleSingleUseRequest"},"ToolCallEventDetailOut":{"properties":{"event":{"$ref":"#/components/schemas/ToolCallEventOut"},"excerpt":{"items":{"$ref":"#/components/schemas/ChatTranscriptMessage"},"type":"array","title":"Excerpt"}},"type":"object","required":["event","excerpt"],"title":"ToolCallEventDetailOut"},"ToolCallEventOut":{"properties":{"id":{"type":"string","title":"Id"},"chat_id":{"type":"string","title":"Chat Id"},"user_id":{"type":"string","title":"User Id"},"user_email":{"type":"string","title":"User Email"},"user_role":{"type":"string","title":"User Role"},"surface":{"type":"string","title":"Surface"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"},"prompt_id":{"type":"string","title":"Prompt Id"},"page_context":{"additionalProperties":{"type":"string"},"type":"object","title":"Page Context"},"tool":{"type":"string","title":"Tool"},"label":{"type":"string","title":"Label"},"call_id":{"type":"string","title":"Call Id"},"round_index":{"type":"integer","title":"Round Index"},"arguments":{"additionalProperties":true,"type":"object","title":"Arguments"},"status":{"type":"string","title":"Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"duration_ms":{"type":"integer","title":"Duration Ms"},"content_chars":{"type":"integer","title":"Content Chars"},"result_summary":{"additionalProperties":true,"type":"object","title":"Result Summary"},"result_content":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result Content"},"trigger_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","chat_id","user_id","user_email","user_role","surface","prompt_id","tool","label","call_id","round_index","status","duration_ms","content_chars","created_at"],"title":"ToolCallEventOut"},"ToolCallEventsPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ToolCallEventOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["items","total","page","page_size"],"title":"ToolCallEventsPage"},"ToolCallSummaryOut":{"properties":{"totals":{"additionalProperties":true,"type":"object","title":"Totals"},"per_tool":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Per Tool"},"per_day":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Per Day"},"per_surface":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Per Surface"},"available_tools":{"items":{"type":"string"},"type":"array","title":"Available Tools"}},"type":"object","required":["totals","per_tool","per_day","per_surface","available_tools"],"title":"ToolCallSummaryOut"},"Topic":{"properties":{"topic_name":{"type":"string","title":"Topic Name"}},"type":"object","required":["topic_name"],"title":"Topic"},"TopicCreate":{"properties":{"title":{"type":"string","title":"Title"},"prerequisite":{"items":{"type":"string"},"type":"array","title":"Prerequisite"},"latex_course":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latex Course"},"latex_exercise":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latex Exercise"},"latex_correction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latex Correction"},"images_course":{"items":{"type":"string"},"type":"array","title":"Images Course"},"images_exercise":{"items":{"type":"string"},"type":"array","title":"Images Exercise"},"images_correction":{"items":{"type":"string"},"type":"array","title":"Images Correction"}},"type":"object","required":["title"],"title":"TopicCreate","description":"Fields needed to create a new topic."},"TopicData":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"latex_course":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latex Course"},"images_course":{"items":{"type":"string"},"type":"array","title":"Images Course"},"latex_exercise":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latex Exercise"},"images_exercise":{"items":{"type":"string"},"type":"array","title":"Images Exercise"},"latex_correction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latex Correction"},"images_correction":{"items":{"type":"string"},"type":"array","title":"Images Correction"}},"type":"object","required":["id","title"],"title":"TopicData","description":"Minimal data for the topic that the session references."},"TopicDetail":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"latex_course":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latex Course"},"latex_exercise":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latex Exercise"},"latex_correction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latex Correction"},"images_course":{"items":{"type":"string"},"type":"array","title":"Images Course"},"images_exercise":{"items":{"type":"string"},"type":"array","title":"Images Exercise"},"images_correction":{"items":{"type":"string"},"type":"array","title":"Images Correction"},"status":{"type":"string","enum":["undetermined","wrong","to_edit","ready"],"title":"Status","default":"undetermined"}},"type":"object","required":["id","title"],"title":"TopicDetail","description":"Detailed topic info for editing."},"TopicOut":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"status":{"type":"string","enum":["undetermined","wrong","to_edit","ready"],"title":"Status","default":"undetermined"},"images_course":{"items":{"type":"string"},"type":"array","title":"Images Course"},"images_exercise":{"items":{"type":"string"},"type":"array","title":"Images Exercise"},"images_correction":{"items":{"type":"string"},"type":"array","title":"Images Correction"}},"type":"object","required":["id","title"],"title":"TopicOut","description":"Minimal info about a Topic."},"TopicPerformance":{"properties":{"topic_name":{"type":"string","title":"Topic Name"},"final_level":{"type":"integer","title":"Final Level"},"history":{"items":{"$ref":"#/components/schemas/LevelSelectionHistory"},"type":"array","title":"History","default":[]}},"type":"object","required":["topic_name","final_level"],"title":"TopicPerformance"},"TopicUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"latex_course":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latex Course"},"latex_exercise":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latex Exercise"},"latex_correction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latex Correction"},"images_course":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Images Course"},"images_exercise":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Images Exercise"},"images_correction":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Images Correction"}},"type":"object","title":"TopicUpdate","description":"Fields you allow to be updated."},"TrackOnboardingEvent":{"properties":{"step":{"type":"string","title":"Step"},"device_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Type"},"onboarding_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding Session Id"},"context":{"additionalProperties":true,"type":"object","title":"Context"}},"type":"object","required":["step"],"title":"TrackOnboardingEvent"},"TranscribeTextRequest":{"properties":{"text":{"type":"string","title":"Text"},"append":{"type":"boolean","title":"Append","default":false}},"type":"object","required":["text"],"title":"TranscribeTextRequest"},"TranscriptItem":{"properties":{"item_id":{"type":"string","title":"Item Id"},"type":{"type":"string","enum":["MESSAGE","BREADCRUMB"],"title":"Type"},"role":{"anyOf":[{"type":"string","enum":["user","assistant"]},{"type":"null"}],"title":"Role"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"expanded":{"type":"boolean","title":"Expanded","default":false},"timestamp":{"type":"string","title":"Timestamp"},"created_at_ms":{"type":"integer","title":"Created At Ms"},"status":{"type":"string","enum":["IN_PROGRESS","DONE"],"title":"Status"},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false}},"type":"object","required":["item_id","type","timestamp","created_at_ms","status"],"title":"TranscriptItem","description":"Individual transcript item in a math session"},"TranscriptionContext":{"properties":{"source":{"type":"string","enum":["self_practice","teacher_assignment","homework_helper","teacher_exam"],"title":"Source"},"assignment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id"},"context_type":{"type":"string","enum":["exercise_session","homework_helper","teacher_exam_subject","teacher_exam_upload","assignment_quick_upload","teacher_exercise_photo"],"title":"Context Type"},"context_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context Id"},"subcontext_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcontext Id"},"image_urls":{"items":{"type":"string"},"type":"array","maxItems":200,"title":"Image Urls"},"transcriptions":{"items":{"type":"string"},"type":"array","maxItems":200,"title":"Transcriptions"},"figure_ids":{"items":{"type":"string"},"type":"array","maxItems":200,"title":"Figure Ids"},"tableaux":{"items":{"$ref":"#/components/schemas/TableauPayload"},"type":"array","maxItems":200,"title":"Tableaux"}},"type":"object","required":["source","context_type"],"title":"TranscriptionContext"},"TranscriptionCorrectionContext":{"properties":{"source":{"type":"string","enum":["self_practice","teacher_assignment","homework_helper"],"title":"Source"},"assignment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id"},"context_type":{"type":"string","const":"exercise_session","title":"Context Type"},"context_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context Id"},"subcontext_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcontext Id"},"block_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Block Id"},"original_transcription":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"Original Transcription"},"suggested_transcription":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"Suggested Transcription"},"suggestion_types":{"items":{"type":"string","enum":["modification","addition","removal"]},"type":"array","maxItems":200,"title":"Suggestion Types"}},"type":"object","required":["source","context_type"],"title":"TranscriptionCorrectionContext"},"TranscriptionCorrectionMetricsSummary":{"properties":{"suggestion_type_filter":{"type":"string","enum":["all","modification","addition","removal"],"title":"Suggestion Type Filter","default":"all"},"emitted_total":{"type":"integer","title":"Emitted Total"},"accepted_total":{"type":"integer","title":"Accepted Total"},"acceptance_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Acceptance Rate"},"emitted_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Emitted Breakdown"},"accepted_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Accepted Breakdown"},"csat_reviews_count":{"type":"integer","title":"Csat Reviews Count","default":0},"csat_high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Csat High Rating Rate"},"low_rating_category_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Low Rating Category Breakdown"},"low_ratings_with_category":{"type":"integer","title":"Low Ratings With Category","default":0}},"type":"object","required":["emitted_total","accepted_total","acceptance_rate"],"title":"TranscriptionCorrectionMetricsSummary"},"TranscriptionCorrectionReviewItem":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"device_type":{"type":"string","title":"Device Type"},"rating":{"type":"integer","title":"Rating"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"context_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context Type"},"context_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context Id"},"subcontext_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcontext Id"},"block_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Block Id"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"original_transcription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Transcription"},"suggested_transcription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Transcription"}},"type":"object","required":["id","created_at","device_type","rating"],"title":"TranscriptionCorrectionReviewItem"},"TranscriptionDatasetSummary":{"properties":{"name":{"type":"string","title":"Name"},"image_count":{"type":"integer","title":"Image Count","default":0}},"type":"object","required":["name"],"title":"TranscriptionDatasetSummary"},"TranscriptionEditDailyStat":{"properties":{"date":{"type":"string","title":"Date"},"initial_count":{"type":"integer","title":"Initial Count"},"edit_event_count":{"type":"integer","title":"Edit Event Count"},"corrected_image_count":{"type":"integer","title":"Corrected Image Count"},"refused_count":{"type":"integer","title":"Refused Count"},"edit_rate":{"type":"number","title":"Edit Rate"}},"type":"object","required":["date","initial_count","edit_event_count","corrected_image_count","refused_count","edit_rate"],"title":"TranscriptionEditDailyStat"},"TranscriptionEditLogListResponse":{"properties":{"logs":{"items":{"$ref":"#/components/schemas/TranscriptionEditLogResponse"},"type":"array","title":"Logs"},"total_count":{"type":"integer","title":"Total Count"},"initial_count":{"type":"integer","title":"Initial Count"},"manual_edit_count":{"type":"integer","title":"Manual Edit Count"},"ai_edit_count":{"type":"integer","title":"Ai Edit Count"},"refused_count":{"type":"integer","title":"Refused Count"},"edit_rate":{"type":"number","title":"Edit Rate"},"corrected_image_count":{"type":"integer","title":"Corrected Image Count"},"daily_stats":{"items":{"$ref":"#/components/schemas/TranscriptionEditDailyStat"},"type":"array","title":"Daily Stats"}},"type":"object","required":["logs","total_count","initial_count","manual_edit_count","ai_edit_count","refused_count","edit_rate","corrected_image_count"],"title":"TranscriptionEditLogListResponse"},"TranscriptionEditLogResponse":{"properties":{"id":{"type":"string","title":"Id"},"session_id":{"type":"string","title":"Session Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"block_id":{"type":"string","title":"Block Id"},"transcription_text":{"type":"string","title":"Transcription Text"},"event_type":{"type":"string","enum":["initial","manual_edit","ai_edit","refused"],"title":"Event Type"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"source_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"},"previous_transcription_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Transcription Text"},"ai_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Prompt"}},"type":"object","required":["id","session_id","exercise_id","block_id","transcription_text","event_type","timestamp"],"title":"TranscriptionEditLogResponse"},"TranscriptionEditPayload":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"block_id":{"type":"string","title":"Block Id"},"transcription_text":{"type":"string","title":"Transcription Text"},"event_type":{"type":"string","enum":["initial","manual_edit","ai_edit"],"title":"Event Type"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"transcription_log_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcription Log Id"},"source_type":{"type":"string","enum":["exercise","homework-helper","custom_course","demo","user_reupload"],"title":"Source Type","default":"exercise"},"previous_transcription_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Transcription Text"},"ai_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Prompt"}},"type":"object","required":["session_id","exercise_id","block_id","transcription_text","event_type"],"title":"TranscriptionEditPayload"},"TranscriptionLatencyPayload":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"perceived_velocity_ms":{"type":"number","title":"Perceived Velocity Ms"},"image_count":{"type":"integer","title":"Image Count"},"device_type":{"type":"string","title":"Device Type"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"transcriptions":{"items":{"type":"string"},"type":"array","title":"Transcriptions"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"transcription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcription"}},"type":"object","required":["session_id","exercise_id","perceived_velocity_ms","image_count","device_type"],"title":"TranscriptionLatencyPayload"},"TranscriptionLogResponse":{"properties":{"id":{"type":"string","title":"Id"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls","default":[]},"transcriptions":{"items":{"type":"string"},"type":"array","title":"Transcriptions","default":[]},"figure_ids":{"items":{"type":"string"},"type":"array","title":"Figure Ids","default":[]},"tableaux":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tableaux","default":[]},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"source_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"},"source_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"},"exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Id"},"previous_transcription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Transcription"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"exercise_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Content"},"exercise_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Solution"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["id","timestamp"],"title":"TranscriptionLogResponse"},"TranscriptionMetricsSummary":{"properties":{"avg_perceived_velocity_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Perceived Velocity Ms"},"p50_perceived_velocity_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P50 Perceived Velocity Ms"},"p95_perceived_velocity_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Perceived Velocity Ms"},"call_count":{"type":"integer","title":"Call Count"},"high_rating_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"High Rating Rate"},"ratings_count":{"type":"integer","title":"Ratings Count"},"correction_actions_per_transcription":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Correction Actions Per Transcription"},"percent_transcriptions_without_changes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percent Transcriptions Without Changes"},"total_transcriptions_with_logs":{"type":"integer","title":"Total Transcriptions With Logs","default":0},"by_device":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"By Device"},"category_breakdown":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Category Breakdown"},"ratings_with_category":{"type":"integer","title":"Ratings With Category","default":0}},"type":"object","required":["avg_perceived_velocity_ms","p50_perceived_velocity_ms","p95_perceived_velocity_ms","call_count","high_rating_rate","ratings_count","by_device"],"title":"TranscriptionMetricsSummary"},"TranscriptionResponse":{"properties":{"transcript":{"type":"string","title":"Transcript"}},"type":"object","required":["transcript"],"title":"TranscriptionResponse","description":"Response model for transcription endpoints."},"TranscriptionReviewItem":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"device_type":{"type":"string","title":"Device Type"},"rating":{"type":"integer","title":"Rating"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"context_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context Type"},"context_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context Id"},"subcontext_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcontext Id"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"transcriptions":{"items":{"type":"string"},"type":"array","title":"Transcriptions"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"transcription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcription"},"category":{"anyOf":[{"type":"string","enum":["text_modified","text_missing","text_added","table_or_figure_missing","figure_wrong","not_helpful"]},{"type":"null"}],"title":"Category"},"figure_ids":{"items":{"type":"string"},"type":"array","title":"Figure Ids"},"tableaux":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tableaux"}},"type":"object","required":["id","created_at","device_type","rating"],"title":"TranscriptionReviewItem"},"TranscriptionTestAttempt":{"properties":{"transcription":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcription"},"status":{"anyOf":[{"type":"string","enum":["correct","incorrect","new-content","mistake-fix"]},{"type":"null"}],"title":"Status"},"last_transcribed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Transcribed At"}},"additionalProperties":false,"type":"object","title":"TranscriptionTestAttempt"},"TranscriptionTestImage":{"properties":{"_id":{"type":"string","title":"Id"},"image_url":{"type":"string","title":"Image Url"},"dataset":{"type":"string","title":"Dataset","default":"default"},"attempts_by_config":{"additionalProperties":{"items":{"$ref":"#/components/schemas/TranscriptionTestAttempt"},"type":"array"},"type":"object","title":"Attempts By Config"},"corrected_attempts_by_config":{"additionalProperties":{"items":{"$ref":"#/components/schemas/TranscriptionTestAttempt"},"type":"array"},"type":"object","title":"Corrected Attempts By Config"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"exercise_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Id"},"exercise_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Content"},"exercise_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exercise Solution"},"ground_truth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ground Truth"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["image_url"],"title":"TranscriptionTestImage"},"TutorialAudioRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name","default":"tutorial_audio.webm"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type","default":"audio/webm"}},"type":"object","required":["file_content"],"title":"TutorialAudioRequest"},"TutorialAudioResponse":{"properties":{"status":{"type":"string","title":"Status"},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["status"],"title":"TutorialAudioResponse"},"TutorialConfigCreate":{"properties":{"name":{"type":"string","title":"Name","description":"Name of the tutorial"},"target_role":{"type":"string","title":"Target Role","description":"Target role ('teacher', 'student')"},"is_published":{"type":"boolean","title":"Is Published","default":false},"modules":{"items":{"$ref":"#/components/schemas/TutorialModuleCreate"},"type":"array","title":"Modules"}},"type":"object","required":["name","target_role"],"title":"TutorialConfigCreate"},"TutorialConfigOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"target_role":{"type":"string","title":"Target Role"},"is_published":{"type":"boolean","title":"Is Published"},"modules":{"items":{"$ref":"#/components/schemas/TutorialModuleOut"},"type":"array","title":"Modules"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"created_by":{"type":"string","title":"Created By"}},"type":"object","required":["id","name","target_role","is_published","modules","created_at","updated_at","created_by"],"title":"TutorialConfigOut"},"TutorialConfigUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"target_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Role"},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Published"},"modules":{"anyOf":[{"items":{"$ref":"#/components/schemas/TutorialModuleCreate"},"type":"array"},{"type":"null"}],"title":"Modules"}},"type":"object","title":"TutorialConfigUpdate"},"TutorialModuleCreate":{"properties":{"key":{"type":"string","title":"Key","description":"Unique key for the module"},"icon_name":{"type":"string","title":"Icon Name","description":"Name of the lucide-react icon"},"order":{"type":"integer","title":"Order","description":"Display order (0-based)"},"sub_steps":{"items":{"$ref":"#/components/schemas/TutorialSubStepCreate"},"type":"array","title":"Sub Steps"},"has_interactive_tutorial":{"type":"boolean","title":"Has Interactive Tutorial","default":false},"interactive_tutorial_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interactive Tutorial Mode"}},"type":"object","required":["key","icon_name","order"],"title":"TutorialModuleCreate"},"TutorialModuleOut":{"properties":{"key":{"type":"string","title":"Key"},"icon_name":{"type":"string","title":"Icon Name"},"order":{"type":"integer","title":"Order"},"sub_steps":{"items":{"$ref":"#/components/schemas/TutorialSubStepOut"},"type":"array","title":"Sub Steps"},"has_interactive_tutorial":{"type":"boolean","title":"Has Interactive Tutorial","default":false},"interactive_tutorial_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interactive Tutorial Mode"}},"type":"object","required":["key","icon_name","order","sub_steps"],"title":"TutorialModuleOut"},"TutorialSubStepCreate":{"properties":{"key":{"type":"string","title":"Key","description":"Unique key for the substep"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url","description":"S3 URL of the video"},"title":{"type":"string","title":"Title","description":"Title displayed to the user"},"description":{"type":"string","title":"Description","description":"Description text"},"order":{"type":"integer","title":"Order","description":"Display order (1-based)"}},"type":"object","required":["key","title","description","order"],"title":"TutorialSubStepCreate"},"TutorialSubStepOut":{"properties":{"key":{"type":"string","title":"Key"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"order":{"type":"integer","title":"Order"}},"type":"object","required":["key","video_url","title","description","order"],"title":"TutorialSubStepOut"},"UnitType":{"type":"string","enum":["chapter","section","topic","concept_explanation","introduction","conclusion","content","flashcards","qcm"],"title":"UnitType","description":"Valid unit types for course content"},"UpcomingWebinarSlotResponse":{"properties":{"id":{"type":"string","title":"Id"},"start_time_utc":{"type":"string","format":"date-time","title":"Start Time Utc"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"zoom_link":{"type":"string","title":"Zoom Link"},"max_attendees":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Attendees"},"is_active":{"type":"boolean","title":"Is Active"},"is_registered_by_current_teacher":{"type":"boolean","title":"Is Registered By Current Teacher"},"current_registrations_count":{"type":"integer","title":"Current Registrations Count"},"is_full":{"type":"boolean","title":"Is Full"}},"type":"object","required":["id","start_time_utc","zoom_link","is_active","is_registered_by_current_teacher","current_registrations_count","is_full"],"title":"UpcomingWebinarSlotResponse","description":"Response model for upcoming webinar slots visible to teachers"},"UpdateAdminClassGradeBody":{"properties":{"grade":{"anyOf":[{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},{"type":"null"}],"title":"Grade"}},"type":"object","title":"UpdateAdminClassGradeBody"},"UpdateAssignmentClassScheduleRequest":{"properties":{"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"}},"type":"object","title":"UpdateAssignmentClassScheduleRequest","description":"One class's planning. Fields left out are untouched; null clears."},"UpdateAssignmentClassesRequest":{"properties":{"class_ids":{"items":{"type":"string"},"type":"array","title":"Class Ids"}},"type":"object","title":"UpdateAssignmentClassesRequest"},"UpdateAssignmentClassesResponse":{"properties":{"status":{"type":"string","title":"Status"},"class_ids":{"items":{"type":"string"},"type":"array","title":"Class Ids"},"class_names":{"items":{"type":"string"},"type":"array","title":"Class Names"}},"type":"object","required":["status","class_ids","class_names"],"title":"UpdateAssignmentClassesResponse"},"UpdateAssignmentGradeRequest":{"properties":{"grade":{"anyOf":[{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},{"type":"null"}],"title":"Grade"}},"type":"object","title":"UpdateAssignmentGradeRequest","description":"« Non renseigné » is a legitimate answer, hence Optional."},"UpdateAssignmentTitleRequest":{"properties":{"title":{"type":"string","title":"Title"}},"type":"object","required":["title"],"title":"UpdateAssignmentTitleRequest"},"UpdateBlockFigureIdRequest":{"properties":{"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"}},"type":"object","title":"UpdateBlockFigureIdRequest"},"UpdateChatPolicyRequest":{"properties":{"policy":{"additionalProperties":{"type":"integer"},"type":"object","title":"Policy"}},"type":"object","required":["policy"],"title":"UpdateChatPolicyRequest"},"UpdateClassGradeBody":{"properties":{"grade":{"anyOf":[{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},{"type":"null"}],"title":"Grade"}},"type":"object","title":"UpdateClassGradeBody"},"UpdateClassNameBody":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"UpdateClassNameBody"},"UpdateCourseAssignmentClassesRequest":{"properties":{"class_ids":{"items":{"type":"string"},"type":"array","title":"Class Ids"}},"type":"object","required":["class_ids"],"title":"UpdateCourseAssignmentClassesRequest","description":"Request model for replacing the full set of classes on the assignment."},"UpdateCourseAssignmentRequest":{"properties":{"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"is_visible_to_students":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Visible To Students"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"sharing_options":{"anyOf":[{"$ref":"#/components/schemas/CourseComponentSharingOptions"},{"type":"null"}]},"knowledge_quiz_settings":{"anyOf":[{"$ref":"#/components/schemas/KnowledgeQuizSettings"},{"type":"null"}]}},"type":"object","title":"UpdateCourseAssignmentRequest","description":"Request model for updating course assignment fields.\n\nThe date fields are legacy: a client that still sends them applies the\nsame dates to every class. New clients use the per-class schedules."},"UpdateCourseClassScheduleRequest":{"properties":{"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"quiz_start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Quiz Start Date"},"quiz_end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Quiz End Date"}},"type":"object","title":"UpdateCourseClassScheduleRequest","description":"One class's dates. Fields left out are untouched; fields sent as null\nare cleared."},"UpdateCourseStructureRequest":{"properties":{"units":{"items":{"$ref":"#/components/schemas/CourseUnit"},"type":"array","title":"Units"}},"type":"object","required":["units"],"title":"UpdateCourseStructureRequest","description":"Request model for updating entire course structure"},"UpdateCourseUnitRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"unit_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Summary"},"generated_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated Content"}},"type":"object","title":"UpdateCourseUnitRequest","description":"Request model for updating course unit fields."},"UpdateDatesRequest":{"properties":{"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Due Date"}},"type":"object","title":"UpdateDatesRequest"},"UpdateEventConfigRequest":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"title_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title Template"},"body_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Template"},"scheduled_hour":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scheduled Hour"}},"type":"object","title":"UpdateEventConfigRequest"},"UpdateExamDetailsRequest":{"properties":{"exam_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exam Title"},"time_limit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Limit"}},"type":"object","title":"UpdateExamDetailsRequest"},"UpdateExamGradeRequest":{"properties":{"grade":{"anyOf":[{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},{"type":"null"}],"title":"Grade"}},"type":"object","title":"UpdateExamGradeRequest"},"UpdateExamTitleRequest":{"properties":{"exam_subject_title":{"type":"string","title":"Exam Subject Title"}},"type":"object","required":["exam_subject_title"],"title":"UpdateExamTitleRequest"},"UpdateExerciseGradeRequest":{"properties":{"grade":{"anyOf":[{"type":"string","enum":["sixieme","cinquieme","quatrieme","troisieme","seconde","premiere","terminale","prepa"]},{"type":"null"}],"title":"Grade"}},"type":"object","title":"UpdateExerciseGradeRequest"},"UpdateExercisePointsRequest":{"properties":{"points":{"type":"number","title":"Points"}},"type":"object","required":["points"],"title":"UpdateExercisePointsRequest"},"UpdateExerciseRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"points":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Points"},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution"},"keep_solution":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Keep Solution"},"regenerate_solution":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Regenerate Solution","default":false},"figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Id"},"solution_figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Figure Id"}},"type":"object","title":"UpdateExerciseRequest"},"UpdateExerciseSharingRequest":{"properties":{"sharing_options":{"$ref":"#/components/schemas/SharingOptions"}},"type":"object","required":["sharing_options"],"title":"UpdateExerciseSharingRequest"},"UpdateExerciseSolutionLatexContentRequest":{"properties":{"solution":{"type":"string","title":"Solution"}},"type":"object","required":["solution"],"title":"UpdateExerciseSolutionLatexContentRequest"},"UpdateExerciseTitleRequest":{"properties":{"title":{"type":"string","title":"Title"}},"type":"object","required":["title"],"title":"UpdateExerciseTitleRequest"},"UpdateFlagStatusRequest":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"UpdateFlagStatusRequest"},"UpdateFlashcardRequest":{"properties":{"front":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Front"},"back":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Back"}},"type":"object","title":"UpdateFlashcardRequest","description":"Request model for updating flashcard fields."},"UpdateGradeBody":{"properties":{"grades":{"items":{},"type":"array","title":"Grades"},"overall_comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Overall Comment"},"total_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Score"}},"type":"object","required":["grades"],"title":"UpdateGradeBody"},"UpdateGroundTruthRequest":{"properties":{"ground_truth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ground Truth"}},"type":"object","title":"UpdateGroundTruthRequest"},"UpdateInstructionsRequest":{"properties":{"custom_instructions":{"type":"string","title":"Custom Instructions"}},"type":"object","required":["custom_instructions"],"title":"UpdateInstructionsRequest"},"UpdateJustificationRequiredRequest":{"properties":{"policy":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Policy"}},"type":"object","required":["policy"],"title":"UpdateJustificationRequiredRequest"},"UpdateLatexContentRequest":{"properties":{"latex_content":{"type":"string","title":"Latex Content"}},"type":"object","required":["latex_content"],"title":"UpdateLatexContentRequest"},"UpdateOrderRequest":{"properties":{"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"}},"type":"object","required":["exercise_ids"],"title":"UpdateOrderRequest"},"UpdateQCMRequest":{"properties":{"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options"},"correct_answer_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Correct Answer Index"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation"}},"type":"object","title":"UpdateQCMRequest","description":"Request model for updating QCM fields."},"UpdateQuestionRequest":{"properties":{"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options"},"correct_answer_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Correct Answer Index"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation"},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer"},"criteria":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Criteria"},"variation_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Variation Index"}},"type":"object","title":"UpdateQuestionRequest","description":"Request to update a quiz question."},"UpdateRetryPolicyRequest":{"properties":{"policy":{"additionalProperties":{"type":"integer"},"type":"object","title":"Policy"}},"type":"object","required":["policy"],"title":"UpdateRetryPolicyRequest"},"UpdateSettingsRequest":{"properties":{"randomize_order":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Randomize Order"},"binary_grading":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Binary Grading"},"typing_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Typing Enabled"},"typed_work_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Typed Work Allowed"},"partial_grade_percentage":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Partial Grade Percentage"},"autonomy_mode":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Autonomy Mode"},"autonomy_attempts_before_solution":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Autonomy Attempts Before Solution"}},"type":"object","title":"UpdateSettingsRequest"},"UpdateSharingRequest":{"properties":{"sharing_options":{"$ref":"#/components/schemas/SharingOptions"}},"type":"object","required":["sharing_options"],"title":"UpdateSharingRequest"},"UpdateStatusBody":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"UpdateStatusBody"},"UpdateStudentPermissionsBody":{"properties":{"permissions":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Permissions"}},"type":"object","required":["permissions"],"title":"UpdateStudentPermissionsBody"},"UpdateTitleRequest":{"properties":{"title":{"type":"string","title":"Title"}},"type":"object","required":["title"],"title":"UpdateTitleRequest"},"UpdateTitleResponse":{"properties":{"status":{"type":"string","title":"Status","default":"success"},"title":{"type":"string","title":"Title"}},"type":"object","required":["title"],"title":"UpdateTitleResponse"},"UpdateTopicRequest":{"properties":{"topic_id":{"type":"string","title":"Topic Id"},"course_id":{"type":"string","title":"Course Id"},"unit_index":{"type":"integer","title":"Unit Index"},"module_index":{"type":"integer","title":"Module Index"},"topic_index":{"type":"integer","title":"Topic Index"},"new_topic_number":{"type":"string","title":"New Topic Number"},"new_topic_title":{"type":"string","title":"New Topic Title"}},"type":"object","required":["topic_id","course_id","unit_index","module_index","topic_index","new_topic_number","new_topic_title"],"title":"UpdateTopicRequest","description":"Request model for updating a topic."},"UpdateUserEmailRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"UpdateUserEmailRequest"},"UpdateUserEmailResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"user_id":{"type":"string","title":"User Id"},"previous_email":{"type":"string","title":"Previous Email"},"email":{"type":"string","title":"Email"},"warning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Warning"}},"type":"object","required":["success","user_id","previous_email","email"],"title":"UpdateUserEmailResponse"},"UpdateUserNameRequest":{"properties":{"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"}},"type":"object","title":"UpdateUserNameRequest"},"UpdateUserNameResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"user_id":{"type":"string","title":"User Id"},"previous_first_name":{"type":"string","title":"Previous First Name"},"previous_last_name":{"type":"string","title":"Previous Last Name"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"}},"type":"object","required":["success","user_id","previous_first_name","previous_last_name","first_name","last_name"],"title":"UpdateUserNameResponse"},"UpdateUserRoleRequest":{"properties":{"role":{"type":"string","enum":["admin","cpge_user","student","teacher"],"title":"Role"}},"type":"object","required":["role"],"title":"UpdateUserRoleRequest"},"UpdateUserRoleResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"user_id":{"type":"string","title":"User Id"},"previous_role":{"type":"string","title":"Previous Role"},"role":{"type":"string","enum":["admin","cpge_user","student","teacher"],"title":"Role"}},"type":"object","required":["success","user_id","previous_role","role"],"title":"UpdateUserRoleResponse"},"UpdateUserSubjectRequest":{"properties":{"subject":{"type":"string","enum":["maths","physique-chimie"],"title":"Subject"}},"type":"object","required":["subject"],"title":"UpdateUserSubjectRequest"},"UpdateUserSubjectResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"user_id":{"type":"string","title":"User Id"},"previous_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Subject"},"subject":{"type":"string","title":"Subject"}},"type":"object","required":["success","user_id","subject"],"title":"UpdateUserSubjectResponse"},"UploadPhotoBody":{"properties":{"image_url":{"type":"string","title":"Image Url"}},"type":"object","required":["image_url"],"title":"UploadPhotoBody"},"UploadResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"url":{"type":"string","title":"Url"}},"type":"object","required":["status","message","url"],"title":"UploadResponse"},"UploadStudentListRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"},"use_ai":{"type":"boolean","title":"Use Ai","default":false}},"type":"object","required":["file_content","file_name","content_type"],"title":"UploadStudentListRequest"},"UploadStudentListResponse":{"properties":{"parsed_students":{"items":{"$ref":"#/components/schemas/ParsedStudentResponse"},"type":"array","title":"Parsed Students"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"ai_available":{"type":"boolean","title":"Ai Available","default":false},"used_ai":{"type":"boolean","title":"Used Ai","default":false}},"type":"object","required":["parsed_students","warnings"],"title":"UploadStudentListResponse"},"UploadWorkRequest":{"properties":{"urls":{"items":{"type":"string"},"type":"array","title":"Urls"}},"type":"object","required":["urls"],"title":"UploadWorkRequest"},"UseFrenchSchoolAction":{"properties":{"action":{"type":"string","const":"use_french_school","title":"Action"},"french_school_id":{"type":"string","title":"French School Id"}},"type":"object","required":["action","french_school_id"],"title":"UseFrenchSchoolAction"},"UseSchoolCodeRequest":{"properties":{"code":{"type":"string","minLength":1,"title":"Code"}},"type":"object","required":["code"],"title":"UseSchoolCodeRequest","description":"Request model for using a school code."},"UseSchoolCodeResponse":{"properties":{"message":{"type":"string","title":"Message"},"access_granted":{"type":"boolean","title":"Access Granted"},"school_name":{"type":"string","title":"School Name"}},"type":"object","required":["message","access_granted","school_name"],"title":"UseSchoolCodeResponse","description":"Response model for using a school code."},"UserCPGEExerciseUpdate":{"properties":{"self_rating":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Self Rating"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"to_review":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"To Review"}},"type":"object","title":"UserCPGEExerciseUpdate","description":"Model for updating user CPGE exercise data"},"UserDailyQuestResponse":{"properties":{"quest_id":{"type":"string","title":"Quest Id"},"daily_active_quest_id":{"type":"string","title":"Daily Active Quest Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"category":{"type":"string","title":"Category"},"actual_target":{"type":"integer","title":"Actual Target"},"xp_reward":{"type":"integer","title":"Xp Reward"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","default":""},"current_progress":{"type":"integer","title":"Current Progress"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"claimed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Claimed At"}},"type":"object","required":["quest_id","daily_active_quest_id","name","description","category","actual_target","xp_reward","current_progress"],"title":"UserDailyQuestResponse"},"UserEarnedBadgeResponse":{"properties":{"badge_definition_id":{"type":"string","title":"Badge Definition Id"},"earned_at":{"type":"string","format":"date-time","title":"Earned At"},"claimed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Claimed At"}},"type":"object","required":["badge_definition_id","earned_at"],"title":"UserEarnedBadgeResponse"},"UserExportData":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","format":"email","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"is_onboarded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Onboarded"},"has_completed_grade_step":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Completed Grade Step"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id"},"stripe_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Subscription Id"},"subscription_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Status"},"trial_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trial End"},"math_confidence":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Math Confidence"},"current_results_perception":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Results Perception"},"current_results_slider_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Results Slider Value"},"motivation_level_slider_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Motivation Level Slider Value"},"interests_main":{"items":{"type":"string"},"type":"array","title":"Interests Main"},"motivation_reasons":{"items":{"type":"string"},"type":"array","title":"Motivation Reasons"},"study_hours_daily_goal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Study Hours Daily Goal"}},"type":"object","required":["id","email"],"title":"UserExportData"},"UserExportResponse":{"properties":{"count":{"type":"integer","title":"Count"},"sample":{"items":{"$ref":"#/components/schemas/UserExportData"},"type":"array","title":"Sample"}},"type":"object","required":["count","sample"],"title":"UserExportResponse"},"UserGamificationStatusResponse":{"properties":{"xp":{"type":"integer","title":"Xp"},"level":{"type":"integer","title":"Level"},"level_name":{"type":"string","title":"Level Name"},"level_altitude":{"type":"string","title":"Level Altitude"},"next_level_xp_required":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Level Xp Required"},"progress_to_next_level_xp":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress To Next Level Xp"},"total_xp_for_current_level":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Xp For Current Level"},"total_xp_for_next_level":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Xp For Next Level"},"earned_badges":{"items":{"$ref":"#/components/schemas/UserEarnedBadgeResponse"},"type":"array","title":"Earned Badges"},"progress_metrics":{"additionalProperties":{"type":"integer"},"type":"object","title":"Progress Metrics"}},"type":"object","required":["xp","level","level_name","level_altitude","earned_badges","progress_metrics"],"title":"UserGamificationStatusResponse"},"UserRegisterSimple":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","minLength":8,"title":"Password"},"first_name":{"type":"string","minLength":1,"title":"First Name"},"last_name":{"type":"string","minLength":1,"title":"Last Name"},"role":{"type":"string","enum":["student","teacher"],"title":"Role","default":"student"},"referral":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral"},"device_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Type"},"onboarding_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding Session Id"}},"type":"object","required":["email","password","first_name","last_name"],"title":"UserRegisterSimple","description":"Simplified registration model - email, password, name, and role"},"UserResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"has_seen_home_tutorial":{"type":"boolean","title":"Has Seen Home Tutorial","default":false},"has_seen_teacher_exam_level_tutorial":{"type":"boolean","title":"Has Seen Teacher Exam Level Tutorial","default":false},"has_seen_teacher_exercise_level_tutorial":{"type":"boolean","title":"Has Seen Teacher Exercise Level Tutorial","default":false},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade"},"filiere":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filiere"},"has_completed_grade_step":{"type":"boolean","title":"Has Completed Grade Step","default":false},"is_onboarded":{"type":"boolean","title":"Is Onboarded","default":false},"is_in_student_mode":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is In Student Mode"},"effective_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective Role"},"is_approved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Approved"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"has_limited_access":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Limited Access"},"beta_features_enabled":{"type":"boolean","title":"Beta Features Enabled","default":false},"is_demo":{"type":"boolean","title":"Is Demo","default":false},"teacher_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Type"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"onboarding_completed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Onboarding Completed"},"onboarding_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding Step"},"last_inbox_opened_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Inbox Opened At"},"establishment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Establishment"},"establishment_prompt_snoozed_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Establishment Prompt Snoozed Until"},"school_affiliation_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Affiliation Status"}},"type":"object","required":["id","email"],"title":"UserResponse","description":"Shape returned to the frontend when requesting the current user."},"UserSearchResult":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"firstname":{"type":"string","title":"Firstname"},"lastname":{"type":"string","title":"Lastname"},"role":{"type":"string","title":"Role"}},"type":"object","required":["id","email","firstname","lastname","role"],"title":"UserSearchResult","description":"Response model for user search results."},"UserSessions":{"properties":{"nextSessions":{"items":{"$ref":"#/components/schemas/SessionWithFeedback"},"type":"array","title":"Nextsessions"},"prevSessions":{"items":{"$ref":"#/components/schemas/SessionWithFeedback"},"type":"array","title":"Prevsessions"}},"type":"object","required":["nextSessions","prevSessions"],"title":"UserSessions","description":"Container for user's sessions."},"UserSettingsResponse":{"properties":{"preferred_model":{"type":"string","title":"Preferred Model","description":"The user's preferred AI model."}},"type":"object","required":["preferred_model"],"title":"UserSettingsResponse"},"UserSettingsUpdate":{"properties":{"preferred_model":{"type":"string","title":"Preferred Model","description":"Preferred model value. Allowed values: 'fast', 'standard', 'smart'."}},"type":"object","required":["preferred_model"],"title":"UserSettingsUpdate"},"ValidateClassCodeRequest":{"properties":{"class_code":{"type":"string","title":"Class Code","description":"The class code to validate"}},"type":"object","required":["class_code"],"title":"ValidateClassCodeRequest"},"ValidateClassCodeResponse":{"properties":{"is_valid":{"type":"boolean","title":"Is Valid","description":"Whether the class code is valid"},"teacher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Name","description":"The name of the teacher who created the class"},"class_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Name","description":"The name of the class"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message if the class code is invalid"},"has_pending_students":{"type":"boolean","title":"Has Pending Students","description":"Whether the class has pending students","default":false},"pending_students":{"items":{"$ref":"#/components/schemas/PendingStudentInfo"},"type":"array","title":"Pending Students","description":"List of pending students in the class"},"matched_pending_student":{"anyOf":[{"$ref":"#/components/schemas/PendingStudentInfo"},{"type":"null"}],"description":"Matched pending student for single-use codes (if any)"}},"type":"object","required":["is_valid"],"title":"ValidateClassCodeResponse"},"ValidateCustomSchoolRequest":{"properties":{"school_name":{"type":"string","title":"School Name"},"city":{"type":"string","title":"City"},"uai":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uai"},"add_to_database":{"type":"boolean","title":"Add To Database","default":true}},"type":"object","required":["school_name","city"],"title":"ValidateCustomSchoolRequest","description":"Request model for validating a custom school."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VariantExerciseDraftResponse":{"properties":{"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"},"solution":{"type":"string","title":"Solution"},"figure_action":{"type":"string","title":"Figure Action"},"figure_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Figure Description"},"solution_figure_action":{"type":"string","title":"Solution Figure Action"},"solution_figure_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Figure Description"},"changes_summary":{"type":"string","title":"Changes Summary"}},"type":"object","required":["title","content","solution","figure_action","figure_description","solution_figure_action","solution_figure_description","changes_summary"],"title":"VariantExerciseDraftResponse"},"VariantExerciseResponse":{"properties":{"source_exercise_id":{"type":"integer","title":"Source Exercise Id"},"source_title":{"type":"string","title":"Source Title"},"source_points":{"type":"number","title":"Source Points"},"source_figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Figure Id"},"source_solution_figure_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Solution Figure Id"},"status":{"type":"string","title":"Status"},"attempts":{"type":"integer","title":"Attempts"},"verified":{"type":"boolean","title":"Verified"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"draft":{"anyOf":[{"$ref":"#/components/schemas/VariantExerciseDraftResponse"},{"type":"null"}]},"verdict":{"anyOf":[{"$ref":"#/components/schemas/VariantVerdictResponse"},{"type":"null"}]}},"type":"object","required":["source_exercise_id","source_title","source_points","source_figure_id","source_solution_figure_id","status","attempts","verified","error","draft","verdict"],"title":"VariantExerciseResponse"},"VariantVerdictResponse":{"properties":{"ok":{"type":"boolean","title":"Ok"},"same_question_count":{"type":"boolean","title":"Same Question Count"},"same_difficulty":{"type":"boolean","title":"Same Difficulty"},"numbers_clean":{"type":"boolean","title":"Numbers Clean"},"solution_correct":{"type":"boolean","title":"Solution Correct"},"figure_consistent":{"type":"boolean","title":"Figure Consistent"},"issues":{"items":{"type":"string"},"type":"array","title":"Issues"}},"type":"object","required":["ok","same_question_count","same_difficulty","numbers_clean","solution_correct","figure_consistent","issues"],"title":"VariantVerdictResponse"},"VariationChange":{"properties":{"index":{"type":"integer","title":"Index"},"new_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Content"},"new_solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Solution"}},"type":"object","required":["index"],"title":"VariationChange","description":"Proposed change for a single variation"},"VariationInput":{"properties":{"content":{"type":"string","title":"Content","description":"Exercise statement in LaTeX/Markdown"},"solution":{"type":"string","title":"Solution","description":"Exercise solution in LaTeX/Markdown"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"Optional JSON data for variables"}},"type":"object","required":["content","solution"],"title":"VariationInput","description":"Input model for creating a variation"},"VariationPreview":{"properties":{"content":{"type":"string","title":"Content"},"solution":{"type":"string","title":"Solution"}},"type":"object","required":["content","solution"],"title":"VariationPreview","description":"Preview of a single variation"},"VariationResponse":{"properties":{"question":{"type":"string","title":"Question"},"options":{"items":{"type":"string"},"type":"array","title":"Options"},"correct_answer_index":{"type":"integer","title":"Correct Answer Index"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation"},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer"},"criteria":{"items":{"type":"string"},"type":"array","title":"Criteria"}},"type":"object","required":["question","options","correct_answer_index"],"title":"VariationResponse","description":"A single variation of a question (for teacher view)."},"VersionCheckResponse":{"properties":{"needs_update":{"type":"boolean","title":"Needs Update"},"latest_version":{"type":"string","title":"Latest Version"},"update_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Update Url"}},"type":"object","required":["needs_update","latest_version"],"title":"VersionCheckResponse"},"VideoUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"VideoUploadRequest"},"WebinarRegistrationInfo":{"properties":{"teacher_id":{"type":"string","title":"Teacher Id"},"teacher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Teacher Name"},"teacher_email":{"type":"string","title":"Teacher Email"},"registered_at_utc":{"type":"string","format":"date-time","title":"Registered At Utc"}},"type":"object","required":["teacher_id","teacher_email","registered_at_utc"],"title":"WebinarRegistrationInfo","description":"Information about a teacher registration"},"WebinarSlotCreateRequest":{"properties":{"start_time_utc":{"type":"string","format":"date-time","title":"Start Time Utc"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"max_attendees":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Attendees"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["start_time_utc"],"title":"WebinarSlotCreateRequest","description":"Request model for creating a webinar slot"},"WebinarSlotResponse":{"properties":{"id":{"type":"string","title":"Id"},"start_time_utc":{"type":"string","format":"date-time","title":"Start Time Utc"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"zoom_link":{"type":"string","title":"Zoom Link"},"max_attendees":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Attendees"},"is_active":{"type":"boolean","title":"Is Active"},"created_by":{"type":"string","title":"Created By"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"registrations_count":{"type":"integer","title":"Registrations Count","default":0},"registrations":{"items":{"$ref":"#/components/schemas/WebinarRegistrationInfo"},"type":"array","title":"Registrations"}},"type":"object","required":["id","start_time_utc","zoom_link","is_active","created_by","created_at","updated_at"],"title":"WebinarSlotResponse","description":"Response model for webinar slot"},"WebinarSlotUpdateRequest":{"properties":{"start_time_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time Utc"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"max_attendees":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Attendees"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"WebinarSlotUpdateRequest","description":"Request model for updating a webinar slot"},"WeightedExerciseCellResponse":{"properties":{"grade":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Grade"},"max_grade":{"type":"number","title":"Max Grade"}},"type":"object","required":["grade","max_grade"],"title":"WeightedExerciseCellResponse"},"WidgetBackfillOut":{"properties":{"started":{"type":"boolean","title":"Started"},"days":{"type":"integer","title":"Days"}},"type":"object","required":["started","days"],"title":"WidgetBackfillOut"},"WidgetEventDetailOut":{"properties":{"event":{"$ref":"#/components/schemas/WidgetEventOut"},"excerpt":{"items":{"$ref":"#/components/schemas/ChatTranscriptMessage"},"type":"array","title":"Excerpt"}},"type":"object","required":["event","excerpt"],"title":"WidgetEventDetailOut"},"WidgetEventOut":{"properties":{"id":{"type":"string","title":"Id"},"chat_id":{"type":"string","title":"Chat Id"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"},"ordinal":{"type":"integer","title":"Ordinal"},"user_id":{"type":"string","title":"User Id"},"user_email":{"type":"string","title":"User Email"},"user_role":{"type":"string","title":"User Role"},"surface":{"type":"string","title":"Surface"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"},"widget":{"type":"string","title":"Widget"},"payload_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payload Excerpt"},"payload_chars":{"type":"integer","title":"Payload Chars"},"closed":{"type":"boolean","title":"Closed"},"trigger_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger Message"},"tool_names":{"items":{"type":"string"},"type":"array","title":"Tool Names"},"applied":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applied"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","chat_id","ordinal","user_id","user_email","user_role","surface","widget","payload_chars","closed","created_at"],"title":"WidgetEventOut"},"WidgetEventsPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/WidgetEventOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["items","total","page","page_size"],"title":"WidgetEventsPage"},"WidgetSummaryOut":{"properties":{"totals":{"additionalProperties":true,"type":"object","title":"Totals"},"per_widget":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Per Widget"},"per_day":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Per Day"},"per_surface":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Per Surface"},"available_widgets":{"items":{"type":"string"},"type":"array","title":"Available Widgets"}},"type":"object","required":["totals","per_widget","per_day","per_surface","available_widgets"],"title":"WidgetSummaryOut"},"_OverrideCriterionOutcome":{"properties":{"criterion_index":{"type":"integer","minimum":0.0,"title":"Criterion Index"},"outcome":{"type":"string","enum":["correct","partial","wrong","unanswered"],"title":"Outcome"},"note":{"type":"string","maxLength":2000,"title":"Note"},"evidence":{"items":{"$ref":"#/components/schemas/_OverrideEvidence"},"type":"array","maxItems":30,"title":"Evidence"}},"type":"object","required":["criterion_index","outcome","note","evidence"],"title":"_OverrideCriterionOutcome"},"_OverrideEvidence":{"properties":{"block_id":{"type":"string","maxLength":64,"title":"Block Id"},"excerpt":{"type":"string","maxLength":10000,"title":"Excerpt"}},"type":"object","required":["block_id","excerpt"],"title":"_OverrideEvidence"},"_OverrideFlaggedError":{"properties":{"description":{"type":"string","maxLength":2000,"title":"Description"},"evidence":{"items":{"$ref":"#/components/schemas/_OverrideEvidence"},"type":"array","maxItems":30,"title":"Evidence"}},"type":"object","required":["description","evidence"],"title":"_OverrideFlaggedError"},"_OverrideQuestion":{"properties":{"skill_outcomes":{"items":{"$ref":"#/components/schemas/_OverrideSkillOutcome"},"type":"array","maxItems":50,"title":"Skill Outcomes"},"criterion_outcomes":{"items":{"$ref":"#/components/schemas/_OverrideCriterionOutcome"},"type":"array","maxItems":50,"title":"Criterion Outcomes"},"errors":{"items":{"$ref":"#/components/schemas/_OverrideFlaggedError"},"type":"array","maxItems":50,"title":"Errors"}},"type":"object","required":["skill_outcomes","criterion_outcomes","errors"],"title":"_OverrideQuestion"},"_OverrideSkillOutcome":{"properties":{"savoir_faire_id":{"type":"string","maxLength":64,"title":"Savoir Faire Id"},"outcome":{"type":"string","enum":["correct","partial","wrong","unanswered"],"title":"Outcome"},"note":{"type":"string","maxLength":2000,"title":"Note"},"evidence":{"items":{"$ref":"#/components/schemas/_OverrideEvidence"},"type":"array","maxItems":30,"title":"Evidence"}},"type":"object","required":["savoir_faire_id","outcome","note","evidence"],"title":"_OverrideSkillOutcome"},"_PutRubricQuestion":{"properties":{"question_text":{"type":"string","maxLength":5000,"title":"Question Text"},"criteria":{"items":{"type":"string","maxLength":1000},"type":"array","maxItems":50,"title":"Criteria"},"skill_savoir_faire_ids":{"items":{"type":"string","maxLength":64},"type":"array","maxItems":50,"title":"Skill Savoir Faire Ids"}},"type":"object","required":["question_text","criteria","skill_savoir_faire_ids"],"title":"_PutRubricQuestion","description":"Override request shape — flat skill ids that the backend hydrates\nagainst the savoirs_faire collection before persisting as `SkillRef`\nsnapshots."},"routers___csat_metrics_shared__CsatReviewItem":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"device_type":{"type":"string","title":"Device Type"},"rating":{"type":"integer","title":"Rating"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"prompt_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prompt Index"},"question":{"type":"string","title":"Question"}},"type":"object","required":["id","created_at","device_type","rating","question"],"title":"CsatReviewItem"},"routers__admin__FileUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"FileUploadRequest"},"routers__admin_copy_correction__CsatReviewItem":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"device_type":{"type":"string","title":"Device Type"},"rating":{"type":"integer","title":"Rating"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"exam_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exam Id"}},"type":"object","required":["id","created_at","device_type","rating"],"title":"CsatReviewItem"},"routers__admin_exercise_stats__ExerciseStatsResponse":{"properties":{"computed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Computed At"},"is_computing":{"type":"boolean","title":"Is Computing"},"self_practice_stats":{"anyOf":[{"$ref":"#/components/schemas/ExerciseCompletionStats"},{"type":"null"}]},"teacher_assignment_stats":{"anyOf":[{"$ref":"#/components/schemas/ExerciseCompletionStats"},{"type":"null"}]}},"type":"object","required":["is_computing"],"title":"ExerciseStatsResponse","description":"Response model for GET /admin/exercise-stats."},"routers__admin_figures__FigureResponse":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"author_id":{"type":"string","title":"Author Id"},"author_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Email"},"generation_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Generation Duration Seconds"},"generation_metadata":{"anyOf":[{"$ref":"#/components/schemas/FigureGenerationMetadataResponse"},{"type":"null"}]},"original_source":{"anyOf":[{"$ref":"#/components/schemas/OriginalSourceInfo"},{"type":"null"}]}},"type":"object","required":["id","status","created_at","updated_at","author_id"],"title":"FigureResponse","description":"Response model for a single figure."},"routers__admin_holiday_courses__BatchFileUploadRequest":{"properties":{"files":{"items":{"$ref":"#/components/schemas/routers__admin_holiday_courses__FileUploadRequest"},"type":"array","title":"Files"},"depth":{"type":"integer","title":"Depth","default":2},"include_qcm":{"type":"boolean","title":"Include Qcm","default":true},"include_flashcards":{"type":"boolean","title":"Include Flashcards","default":true},"include_illustrations":{"type":"boolean","title":"Include Illustrations","default":false},"include_excellence_tips":{"type":"boolean","title":"Include Excellence Tips","default":false}},"type":"object","required":["files"],"title":"BatchFileUploadRequest","description":"Request model for batch file upload with course generation options"},"routers__admin_holiday_courses__CourseUploadResponse":{"properties":{"course_id":{"type":"string","title":"Course Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["course_id","status"],"title":"CourseUploadResponse","description":"Response model for course creation"},"routers__admin_holiday_courses__CreateCourseFromUrlsRequest":{"properties":{"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"depth":{"type":"integer","title":"Depth","default":2},"include_qcm":{"type":"boolean","title":"Include Qcm","default":true},"include_flashcards":{"type":"boolean","title":"Include Flashcards","default":true},"include_illustrations":{"type":"boolean","title":"Include Illustrations","default":false},"include_excellence_tips":{"type":"boolean","title":"Include Excellence Tips","default":false}},"type":"object","required":["image_urls"],"title":"CreateCourseFromUrlsRequest","description":"Request model for creating course from image URLs"},"routers__admin_holiday_courses__FileUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"FileUploadRequest","description":"Request model for individual file upload"},"routers__admin_pdf_failures__SendReplyRequest":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"SendReplyRequest"},"routers__admin_pdf_failures__UpdateStatusRequest":{"properties":{"status":{"type":"string","enum":["new","in-progress","done"],"title":"Status"}},"type":"object","required":["status"],"title":"UpdateStatusRequest"},"routers__admin_public_exercises__CpgeMetadata":{"properties":{"hints":{"items":{"type":"string"},"type":"array","title":"Hints"},"banque":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banque"}},"type":"object","title":"CpgeMetadata"},"routers__admin_public_exercises__MoveCategoryInput":{"properties":{"source_path":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Source Path"},"destination_path":{"items":{"type":"string"},"type":"array","title":"Destination Path"}},"type":"object","required":["source_path"],"title":"MoveCategoryInput"},"routers__admin_public_exercises__RenameCategoryInput":{"properties":{"category_path":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Category Path"},"new_name":{"type":"string","minLength":1,"title":"New Name"}},"type":"object","required":["category_path","new_name"],"title":"RenameCategoryInput"},"routers__admin_teacher_exams__UpdateExerciseLatexContentRequest":{"properties":{"content":{"type":"string","title":"Content"},"solution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution"}},"type":"object","required":["content"],"title":"UpdateExerciseLatexContentRequest"},"routers__admin_transcription_tests__UpdateStatusRequest":{"properties":{"attempt_index":{"type":"integer","exclusiveMaximum":3.0,"minimum":0.0,"title":"Attempt Index"},"configuration":{"anyOf":[{"type":"string","enum":["no_context","content","solution","both"]},{"type":"null"}],"title":"Configuration"},"attempt_type":{"type":"string","enum":["initial","corrected"],"title":"Attempt Type","default":"initial"},"status":{"anyOf":[{"type":"string","enum":["correct","incorrect","new-content","mistake-fix"]},{"type":"null"}],"title":"Status"}},"type":"object","required":["attempt_index"],"title":"UpdateStatusRequest"},"routers__binairo__LeaderboardResponse":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/LeaderboardEntry"},"type":"array","title":"Entries"},"current_user_entry":{"anyOf":[{"$ref":"#/components/schemas/LeaderboardEntry"},{"type":"null"}]}},"type":"object","required":["entries"],"title":"LeaderboardResponse"},"routers__calcul_exercises__MoveCategoryInput":{"properties":{"source_path":{"items":{"type":"string"},"type":"array","title":"Source Path","description":"Source category path to move"},"destination_path":{"items":{"type":"string"},"type":"array","title":"Destination Path","description":"Destination category path"}},"type":"object","required":["source_path","destination_path"],"title":"MoveCategoryInput","description":"Input model for moving a category"},"routers__calcul_exercises__RenameCategoryInput":{"properties":{"category_path":{"items":{"type":"string"},"type":"array","title":"Category Path","description":"Category path to rename"},"new_name":{"type":"string","title":"New Name","description":"New name for the category"}},"type":"object","required":["category_path","new_name"],"title":"RenameCategoryInput","description":"Input model for renaming a category"},"routers__courses_routes__BasicResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["status","message"],"title":"BasicResponse"},"routers__courses_routes__ChatHistoryResponse":{"properties":{"topic_name":{"type":"string","title":"Topic Name"},"conversation_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conversation History","default":[]}},"type":"object","required":["topic_name"],"title":"ChatHistoryResponse"},"routers__courses_routes__ConversationRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Your question or answer attempt..."},"type":{"type":"string","enum":["text","image_url","image_description"],"title":"Type","description":"The type of message to send"}},"type":"object","required":["text","type"],"title":"ConversationRequest"},"routers__courses_routes__ImageUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"ImageUploadRequest"},"routers__cpge_exercises__BasicResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["status","message"],"title":"BasicResponse"},"routers__cpge_exercises__BatchReformatRequest":{"properties":{"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"},"field":{"type":"string","enum":["content","solution","hints1","hints2","hints3"],"title":"Field"}},"type":"object","required":["exercise_ids","field"],"title":"BatchReformatRequest"},"routers__cpge_exercises__BatchReformatResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/BatchReformatResult"},"type":"array","title":"Results"},"failed_ids":{"items":{"type":"string"},"type":"array","title":"Failed Ids"}},"type":"object","required":["results","failed_ids"],"title":"BatchReformatResponse"},"routers__cpge_exercises__ReformatRequest":{"properties":{"field":{"type":"string","enum":["content","solution","hints1","hints2","hints3"],"title":"Field"},"text":{"type":"string","title":"Text"}},"type":"object","required":["field","text"],"title":"ReformatRequest"},"routers__custom_courses__BasicResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["status","message"],"title":"BasicResponse"},"routers__custom_courses__ChatHistoryResponse":{"properties":{"course_id":{"type":"string","title":"Course Id"},"conversation_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conversation History","default":[]}},"type":"object","required":["course_id"],"title":"ChatHistoryResponse"},"routers__custom_courses__ConversationRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Your question or answer attempt..."},"type":{"type":"string","enum":["text","image_url","image_description"],"title":"Type"}},"type":"object","required":["text","type"],"title":"ConversationRequest"},"routers__custom_courses__CustomCourseContent":{"properties":{"content":{"type":"string","title":"Content"},"latex_content":{"type":"string","title":"Latex Content"},"content_type":{"type":"string","title":"Content Type"},"order":{"type":"integer","title":"Order"},"created_at":{"type":"string","format":"date-time","title":"Created At","default":"2026-09-02T15:38:51.670618"}},"type":"object","required":["content","latex_content","content_type","order"],"title":"CustomCourseContent"},"routers__custom_courses__CustomCourseResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"content":{"items":{"$ref":"#/components/schemas/routers__custom_courses__CustomCourseContent"},"type":"array","title":"Content"}},"type":"object","required":["id","title","content"],"title":"CustomCourseResponse"},"routers__custom_courses__ImageUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"ImageUploadRequest"},"routers__demo_custom_course__BasicResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["status","message"],"title":"BasicResponse"},"routers__demo_custom_course__ChatHistoryResponse":{"properties":{"course_id":{"type":"string","title":"Course Id"},"conversation_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conversation History","default":[]}},"type":"object","required":["course_id"],"title":"ChatHistoryResponse"},"routers__demo_custom_course__ConversationRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Your question or answer attempt..."},"type":{"type":"string","enum":["text","image_url","image_description"],"title":"Type","description":"The type of message to send"}},"type":"object","required":["text","type"],"title":"ConversationRequest"},"routers__demo_custom_course__CustomCourseContent":{"properties":{"content":{"type":"string","title":"Content"},"latex_content":{"type":"string","title":"Latex Content"},"content_type":{"type":"string","title":"Content Type"},"order":{"type":"integer","title":"Order"},"created_at":{"type":"string","format":"date-time","title":"Created At","default":"2026-09-02T15:38:52.533857"}},"type":"object","required":["content","latex_content","content_type","order"],"title":"CustomCourseContent"},"routers__demo_custom_course__CustomCourseResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"content":{"items":{"$ref":"#/components/schemas/routers__demo_custom_course__CustomCourseContent"},"type":"array","title":"Content"}},"type":"object","required":["id","title","content"],"title":"CustomCourseResponse"},"routers__demo_custom_course__ImageUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"ImageUploadRequest"},"routers__demo_homework_helper__BasicResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["status","message"],"title":"BasicResponse"},"routers__demo_homework_helper__ChatHistoryResponse":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"conversation_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conversation History","default":[]}},"type":"object","required":["exercise_id"],"title":"ChatHistoryResponse"},"routers__demo_homework_helper__ChatRequest":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"message":{"type":"string","title":"Message"},"type":{"type":"string","enum":["text","image_url","image_description"],"title":"Type"}},"type":"object","required":["exercise_id","message","type"],"title":"ChatRequest"},"routers__demo_homework_helper__ScanExerciseRequest":{"properties":{"image_url":{"type":"string","title":"Image Url","description":"The S3 URL of the image to scan"}},"type":"object","required":["image_url"],"title":"ScanExerciseRequest"},"routers__demo_homework_helper__ScanExerciseResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"latex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latex"}},"type":"object","required":["status","message"],"title":"ScanExerciseResponse"},"routers__exercise_assignments__BasicResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"assignment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id"}},"type":"object","required":["status","message"],"title":"BasicResponse"},"routers__exercise_assignments__ExerciseStatsResponse":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"total_chat_messages":{"type":"integer","title":"Total Chat Messages","default":0},"students_who_used_chat":{"type":"integer","title":"Students Who Used Chat","default":0},"total_attempts":{"type":"integer","title":"Total Attempts","default":0},"average_attempts":{"type":"number","title":"Average Attempts","default":0.0},"students_who_attempted":{"type":"integer","title":"Students Who Attempted","default":0}},"type":"object","required":["exercise_id"],"title":"ExerciseStatsResponse","description":"Per-exercise statistics for teacher analytics."},"routers__exercise_assignments__SchoolTeachersResponse":{"properties":{"teachers":{"items":{"$ref":"#/components/schemas/SchoolTeacherInfo"},"type":"array","title":"Teachers"},"school_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"School Name"}},"type":"object","required":["teachers"],"title":"SchoolTeachersResponse","description":"Response with list of teachers in the same school"},"routers__exercise_practice__BasicResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["status","message"],"title":"BasicResponse"},"routers__exercise_practice__ChatHistoryResponse":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"conversation_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conversation History","default":[]}},"type":"object","required":["exercise_id"],"title":"ChatHistoryResponse"},"routers__exercise_practice__ChatRequest":{"properties":{"message":{"type":"string","title":"Message"},"type":{"type":"string","enum":["text","image_url","image_description"],"title":"Type"}},"type":"object","required":["message","type"],"title":"ChatRequest"},"routers__exercise_sessions__BasicResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["status","message"],"title":"BasicResponse"},"routers__exercise_sessions__SessionResponse":{"properties":{"session":{"additionalProperties":true,"type":"object","title":"Session"},"exercises":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Exercises"}},"type":"object","required":["session","exercises"],"title":"SessionResponse"},"routers__feedback_routes__SendReplyRequest":{"properties":{"message":{"type":"string","title":"Message"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls","default":[]}},"type":"object","required":["message"],"title":"SendReplyRequest"},"routers__feedback_routes__UpdateStatusRequest":{"properties":{"status":{"type":"string","enum":["new","in-progress","done"],"title":"Status"}},"type":"object","required":["status"],"title":"UpdateStatusRequest"},"routers__figures__FigureResponse":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"reprompted_from_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reprompted From Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"can_retry":{"type":"boolean","title":"Can Retry","default":false}},"type":"object","required":["id","status","created_at","updated_at"],"title":"FigureResponse"},"routers__holiday_content__CheckMultimodalSolutionRequest":{"properties":{"sub_chapitre_id":{"type":"string","title":"Sub Chapitre Id"},"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["sub_chapitre_id","file_content","file_name","content_type"],"title":"CheckMultimodalSolutionRequest","description":"Request model for multimodal solution checking (audio or image)."},"routers__homework_helper_routes__BasicResponse":{"properties":{"status":{"type":"string","enum":["success","error"],"title":"Status"},"message":{"type":"string","title":"Message"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"}},"type":"object","required":["status","message"],"title":"BasicResponse"},"routers__homework_helper_routes__ScanExerciseRequest":{"properties":{"image_url":{"type":"string","title":"Image Url","description":"S3 URL of the image to scan"}},"type":"object","required":["image_url"],"title":"ScanExerciseRequest"},"routers__homework_helper_routes__ScanExerciseResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"latex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latex"}},"type":"object","required":["status","message","latex"],"title":"ScanExerciseResponse"},"routers__leaderboard__LeaderboardResponse":{"properties":{"top_users":{"items":{"$ref":"#/components/schemas/LeaderboardUserResponse"},"type":"array","title":"Top Users"},"current_user":{"anyOf":[{"$ref":"#/components/schemas/LeaderboardUserResponse"},{"type":"null"}]},"current_user_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current User Rank"},"total_users":{"type":"integer","title":"Total Users"},"user_eligible":{"type":"boolean","title":"User Eligible"}},"type":"object","required":["top_users","total_users","user_eligible"],"title":"LeaderboardResponse"},"routers__mobile_upload__ImageUploadRequest":{"properties":{"files":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"ImageUploadRequest"},"routers__my_courses__BasicResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["status","message"],"title":"BasicResponse"},"routers__my_courses__BatchFileUploadRequest":{"properties":{"files":{"items":{"$ref":"#/components/schemas/routers__my_courses__FileUploadRequest"},"type":"array","title":"Files"},"depth":{"type":"integer","title":"Depth","default":2},"include_qcm":{"type":"boolean","title":"Include Qcm","default":false},"include_flashcards":{"type":"boolean","title":"Include Flashcards","default":false},"include_illustrations":{"type":"boolean","title":"Include Illustrations","default":false},"include_excellence_tips":{"type":"boolean","title":"Include Excellence Tips","default":false},"custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Instructions"},"create_as_teacher":{"type":"boolean","title":"Create As Teacher","default":false},"subject":{"anyOf":[{"type":"string","enum":["maths","physique-chimie"]},{"type":"null"}],"title":"Subject"}},"type":"object","required":["files"],"title":"BatchFileUploadRequest"},"routers__my_courses__ChatHistoryResponse":{"properties":{"course_id":{"type":"string","title":"Course Id"},"conversation_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conversation History","default":[]}},"type":"object","required":["course_id"],"title":"ChatHistoryResponse"},"routers__my_courses__ChatRequest":{"properties":{"course_id":{"type":"string","title":"Course Id"},"message":{"type":"string","title":"Message"},"type":{"type":"string","enum":["text","image_url","image_description","graph"],"title":"Type","default":"text"}},"type":"object","required":["course_id","message"],"title":"ChatRequest"},"routers__my_courses__CourseUploadResponse":{"properties":{"course_id":{"type":"string","title":"Course Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["course_id","status"],"title":"CourseUploadResponse"},"routers__my_courses__CreateCourseFromUrlsRequest":{"properties":{"title":{"type":"string","title":"Title"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"source_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Text"},"depth":{"type":"integer","title":"Depth","default":2},"include_qcm":{"type":"boolean","title":"Include Qcm","default":false},"include_flashcards":{"type":"boolean","title":"Include Flashcards","default":false},"include_illustrations":{"type":"boolean","title":"Include Illustrations","default":false},"include_excellence_tips":{"type":"boolean","title":"Include Excellence Tips","default":false},"custom_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Instructions"},"create_as_teacher":{"type":"boolean","title":"Create As Teacher","default":false},"subject":{"anyOf":[{"type":"string","enum":["maths","physique-chimie"]},{"type":"null"}],"title":"Subject"}},"type":"object","required":["title","image_urls"],"title":"CreateCourseFromUrlsRequest"},"routers__my_courses__FileUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"FileUploadRequest"},"routers__public_exercises__BatchReformatRequest":{"properties":{"exercise_ids":{"items":{"type":"string"},"type":"array","title":"Exercise Ids"},"field":{"type":"string","enum":["content","solution"],"title":"Field"}},"type":"object","required":["exercise_ids","field"],"title":"BatchReformatRequest"},"routers__public_exercises__BatchReformatResponse":{"properties":{"results":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Results"},"failed_ids":{"items":{"type":"string"},"type":"array","title":"Failed Ids","default":[]}},"type":"object","required":["results"],"title":"BatchReformatResponse"},"routers__public_exercises__CpgeMetadata":{"properties":{"hints":{"items":{"type":"string"},"type":"array","title":"Hints"},"banque":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banque"}},"type":"object","title":"CpgeMetadata","description":"CPGE-specific fields, present only when `library == \"cpge\"`.\n\nGrouped into a subdoc so that readers of a regular public exercise\ndon't have to reason about hints / banque at all — those are\ngenuinely prepa-only concerns."},"routers__public_exercises__ReformatRequest":{"properties":{"field":{"type":"string","enum":["content","solution"],"title":"Field"},"text":{"type":"string","title":"Text"}},"type":"object","required":["field","text"],"title":"ReformatRequest"},"routers__simple_chat__BasicResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"data":{"anyOf":[{},{"type":"null"}],"title":"Data"}},"type":"object","required":["status","message"],"title":"BasicResponse"},"routers__student__LinkClassBody":{"properties":{"code":{"type":"string","title":"Code"},"pending_student_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Student Id"}},"type":"object","required":["code"],"title":"LinkClassBody"},"routers__student_chat_routes__CreateThreadRequest":{"properties":{"title":{"type":"string","title":"Title","default":"Untitled"}},"type":"object","title":"CreateThreadRequest"},"routers__student_chat_routes__ImageUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"ImageUploadRequest"},"routers__student_exams__FileUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"FileUploadRequest"},"routers__student_exams__TranscriptRequest":{"properties":{"transcript":{"type":"string","title":"Transcript"}},"type":"object","required":["transcript"],"title":"TranscriptRequest"},"routers__student_progress__CheckMultimodalSolutionRequest":{"properties":{"sub_chapitre_id":{"type":"string","title":"Sub Chapitre Id"},"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["sub_chapitre_id","file_content","file_name","content_type"],"title":"CheckMultimodalSolutionRequest","description":"Payload for checking a multimodal solution (audio/image) with granular assessment."},"routers__teacher__LinkClassBody":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"LinkClassBody"},"routers__teacher_exams__sharing__SchoolTeachersResponse":{"properties":{"status":{"type":"string","title":"Status"},"teachers":{"items":{"$ref":"#/components/schemas/SchoolTeacher"},"type":"array","title":"Teachers"}},"type":"object","required":["status","teachers"],"title":"SchoolTeachersResponse"},"routers__teacher_exams__subjects__UpdateExerciseLatexContentRequest":{"properties":{"content":{"type":"string","title":"Content"},"keep_solution":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Keep Solution","default":true},"regenerate_solution":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Regenerate Solution","default":false}},"type":"object","required":["content"],"title":"UpdateExerciseLatexContentRequest"},"routers__teacher_exams__transcripts__TranscriptRequest":{"properties":{"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"images":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Images"}},"type":"object","title":"TranscriptRequest"},"routers__teacher_exercises__SchoolTeachersResponse":{"properties":{"status":{"type":"string","title":"Status"},"teachers":{"items":{"$ref":"#/components/schemas/SchoolTeacher"},"type":"array","title":"Teachers"}},"type":"object","required":["status","teachers"],"title":"SchoolTeachersResponse"},"routers__threads_routes__CreateThreadRequest":{"properties":{"student_id":{"type":"string","title":"Student Id"},"title":{"type":"string","title":"Title","default":"Untitled"}},"type":"object","required":["student_id"],"title":"CreateThreadRequest"},"routers__threads_routes__ImageUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"ImageUploadRequest"},"routers__topic_routes__BasicResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"transcript":{"type":"string","title":"Transcript"}},"type":"object","required":["status","message","transcript"],"title":"BasicResponse"},"routers__tutorial_config__FileUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"FileUploadRequest"},"routers__us_session__BasicResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"}},"type":"object","required":["status","message"],"title":"BasicResponse","description":"Simple status+message response."},"routers__us_session__ChatHistoryResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"conversation_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conversation History","default":[]}},"type":"object","required":["session_id"],"title":"ChatHistoryResponse","description":"Chat history response model."},"routers__us_session__FileUploadRequest":{"properties":{"file_content":{"type":"string","title":"File Content"},"file_name":{"type":"string","title":"File Name"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["file_content","file_name","content_type"],"title":"FileUploadRequest"},"routers__us_session__SessionResponse":{"properties":{"session":{"$ref":"#/components/schemas/SessionData"},"topic":{"$ref":"#/components/schemas/TopicData"}},"type":"object","required":["session","topic"],"title":"SessionResponse","description":"Combines session + topic info for the daily session flow."},"schemas__class_dashboard__mastery__SkillMasteryResponse":{"properties":{"savoir_faire_id":{"type":"string","title":"Savoir Faire Id"},"name":{"type":"string","title":"Name"},"chapter":{"type":"string","title":"Chapter"},"evaluated_count":{"type":"integer","title":"Evaluated Count"},"class_mastery":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Class Mastery"},"cells":{"items":{"$ref":"#/components/schemas/MasteryCellResponse"},"type":"array","title":"Cells"}},"type":"object","required":["savoir_faire_id","name","chapter","evaluated_count","cells"],"title":"SkillMasteryResponse"},"schemas__student_progression__SkillMasteryResponse":{"properties":{"savoir_faire_id":{"type":"string","title":"Savoir Faire Id"},"name":{"type":"string","title":"Name"},"chapter":{"type":"string","title":"Chapter"},"posterior":{"type":"number","title":"Posterior"},"n_observations":{"type":"integer","title":"N Observations"},"prior_reason":{"type":"string","title":"Prior Reason"}},"type":"object","required":["savoir_faire_id","name","chapter","posterior","n_observations","prior_reason"],"title":"SkillMasteryResponse"}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"api/login"}}},"HTTPBearer":{"type":"http","scheme":"bearer"}}}}