API¶
Машинна специфікація всіх маршрутів — в описі API: api.pythoncourse.me/openapi.json. Нижче — провідник для платформи школи, що подає студентські роботи через API: як прийняти відповіді на тест і що перевіряється в коментарі студента.
Тест як подача¶
Тест подається не файлом, а відповідями на його питання. Обидва маршрути нижче — ключ доступу
школи в заголовку X-API-Key зі сферою CHECK, та сама, що й для подачі файлом. Ключ без цієї
сфери отримує 403 Requires scope: check.
Тест перевіряється за правильними відповідями, які автор позначив у самому тесті (див. Для авторів), і маршрути нижче бачать лише версію, яку автор опублікував; рецензія приходить вебхуком, як і на файл.
Прочитати тест¶
curl https://api.pythoncourse.me/api/v1/homework/tasks/$TASK_ID/test \
-H "X-API-Key: $CHECK_KEY"
Відповідь 200 — рівно три поля:
{
"version": "3f9c1e…",
"accepting_answers": true,
"questions": [
{
"number": "1",
"text": "Що таке контекстне вікно моделі?",
"options": [
{"label": "а", "text": "Вікно редактора, у якому агент показує зміни"},
{"label": "б", "text": "Обсяг тексту, який модель бачить за один виклик"}
]
}
]
}
version— поточна версія тесту. Надсилайте її назад якtest_versionразом із відповідями.accepting_answers— чи приймаються відповіді зараз. Покиfalse, подача відмовляється кодомTEST_FORM_UNAVAILABLE— показуйте студентові тест, але не приймайте відповідей.questions— питання й варіанти опублікованої версії: номер і текст питання, мітка й текст кожного варіанта. Тексти — так, як їх записав автор; номери й мітки ставить система за порядком — українськими літерами для курсу українською, малими латинськими для решти.
Нічого з ключа тут немає: ні правильних варіантів, ні того, скільки їх у питанні, ні пояснень. Питання, де правильних відповідей кілька, автор позначає словами в тексті питання, тож показуйте біля кожного варіанта прапорець.
404 Task not found. — однакова відповідь на завдання, якого немає, видалене, завдання іншої
школи й завдання, що не є опублікованим тестом: інший матеріал або тест, якого автор ще не
опублікував.
Надіслати відповіді¶
curl -X POST https://api.pythoncourse.me/api/v1/homework/submit-test \
-H "X-API-Key: $CHECK_KEY" -H "Content-Type: application/json" \
-d '{
"student_external_id": "student-42",
"course_node_id": "…",
"node_id": "…",
"authored_document_id": "…",
"answers": {"1": ["б"], "2": ["а", "в"]},
"test_version": "3f9c1e…",
"response_language": "en"
}'
| поле | обов'язкове | що це |
|---|---|---|
student_external_id |
так | ідентифікатор студента у вашій системі |
course_node_id |
так | курс |
node_id |
так | вузол курсу, до якого належить тест |
authored_document_id |
так | сам тест |
answers |
так | номер питання → мітки позначених варіантів |
test_version |
ні | version, яку повернуло читання тесту |
webhook_url |
ні | адреса вебхука для цієї подачі; без неї — типова адреса школи |
response_language |
ні | мова рецензії, код ISO 639-1 або 639-3 |
student_note |
ні | коментар студента до спроби, до 2 000 знаків (див. Коментар студента) |
Відповіді. Надсилайте кожну мітку саме так, як її показав маршрут структури (label), — тими
самими літерами й у тому самому регістрі. Питання без відповіді не відмовляється — воно рахується
неправильним. Питання чи мітка, яких у тесті немає, — відмова
ANSWERS_DO_NOT_MATCH_TEST.
Версія тесту. test_version необов'язкова. Якщо її надіслано й вона не поточна — відмова
TEST_VERSION_CHANGED: тест змінився, поки студент відповідав. Без неї
відповіді звіряються з поточною версією.
202 — подачу прийнято:
{"submission_id": "…", "student_id": "…", "status": "received", "job_id": "…", "duplicate": false}
Ті самі відповіді, надіслані двічі, — дві спроби: кожна перевіряється й отримує власну рецензію.
Курс, вузол і завдання перевіряються так само, як у подачі файлом: 404 на те, чого у вашій
школі немає, — і та сама 404 Task not found. на завдання, що не є опублікованим тестом. Далі —
власні перевірки тесту, кожна зі своїм кодом (див. Відмови подачі тесту).
Файл на тестове завдання маршрутом подачі файла (POST /api/v1/homework/submit) відмовляється
кодом TEST_ANSWERS_REQUIRED, а на тест, якого автор ще не опублікував, —
404 Task not found., як на відсутнє завдання.
Рецензія у вебхуку¶
Рецензію на тест приносить подія reviewed — та сама, що й для файла, з тими самими полями.
Для тесту вони означають таке:
| поле | для тесту |
|---|---|
review.score |
частка правильних відповідей, ціле число відсотків, округлене вниз |
review.passed |
чи досягнуто поріг заліку; якщо автор порогу не задав — true: планки, якої можна не взяти, немає |
review.correctness |
з балу: 100 → correct, 0 → incorrect, інакше → partially_correct |
review.review_text |
рецензія текстом (Markdown) — її можна показати студентові як є |
structure.test |
те саме по питаннях: number, correct, correct_answer (мітка й текст правильних варіантів), explanation; а також score, explanations_in_course_language, retry_offer |
Якщо рецензію скласти не вдалося, приходить подія failed із причиною в reason:
path_failed¶
Подачу не вдалося перевірити через збій на нашому боці, і рецензії на неї не буде. Запропонуйте студентові надіслати відповіді ще раз.
test_not_ready¶
Для тестів, створених у системі, не надходить: подачу перевіряють за версією тесту, на яку її прийнято, а опублікована версія завжди має правильні відповіді. Раніше ця причина означала, що поки подача чекала перевірки, автор прибрав або змінив ключ відповідей. Якщо ваша платформа її вже обробляє, обробку можна лишити: скажіть студентові, що тест тимчасово не приймає відповідей, і запропонуйте спробувати пізніше.
Відмови подачі тесту¶
Відмова приходить до того, як щось збережено: подачі не створено, нічого не записано. У полі
detail — код причини й пояснення, {"code": "…", "details": "…"}. Код — для вашого коду; слова для
студента добирайте самі за кодом, details — запасний текст для коду, якого ваша платформа ще не
знає.
Перевірки йдуть у такому порядку: чи тест приймає відповіді взагалі → чи та версія → чи збігаються питання й мітки → коментар студента (див. Коментар студента). Тож на подачу з кількома вадами приходить код першої.
TEST_ANSWERS_REQUIRED¶
422. На тест надіслано файл. Тест складається відповідями: надішліть їх маршрутом
POST /api/v1/homework/submit-test.
TEST_FORM_UNAVAILABLE¶
409. Тести тимчасово не приймаються відповідями. Файлом тест, створений у системі, теж не
складається, тож скажіть студентові, що тест тимчасово недоступний, і спробуйте пізніше — коли
читання тесту знову покаже accepting_answers: true.
NOT_A_TEST_TASK¶
422. Для тестів, створених у системі, не видається: на завдання, що не є опублікованим
тестом, маршрути тесту відповідають 404 Task not found.. Раніше цей код означав, що завдання —
не тест. Якщо ваша платформа його вже обробляє, обробку можна лишити: надішліть роботу файлом або
перевірте, що вказано саме тестове завдання.
TEST_VERSION_CHANGED¶
409. Відповіді дано на версію тесту, яка вже не поточна: автор змінив тест, поки студент відповідав. Прочитайте тест знову, покажіть студентові нову версію й надішліть відповіді на неї.
TEST_NOT_READY¶
409. Для тестів, створених у системі, не видається: опублікована версія тесту завжди має правильні відповіді, а неопублікованого тесту маршрути не бачать зовсім. Раніше цей код означав, що для поточної версії тесту немає ключа відповідей. Якщо ваша платформа його вже обробляє, обробку можна лишити: скажіть студентові, що тест ще не готовий, і спробуйте пізніше.
ANSWERS_DO_NOT_MATCH_TEST¶
422. Відповіді називають питання або варіант, яких у тесті немає; details перелічує їх.
Звірте відповіді з читанням тесту — номери питань і мітки варіантів — і надішліть їх знову.
Коментар студента¶
До подачі файлом (POST /api/v1/homework/submit, поле форми student_note) і до відповідей на тест
(POST /api/v1/homework/submit-test, поле student_note) студент може додати коментар — питання чи
уточнення до роботи. Коментар перевіряється до того, як щось збережено:
- довжина — до 2 000 знаків; перенос рядка рахується за один знак, пробіли на початку й у кінці не рахуються й не зберігаються;
- текстові перевірки — ті самі, що й для текстових файлів подачі. Відмовляють лише символи, яких не буває в законному тексті: зміна напрямку тексту, тегові й керівні символи. Невидимі пробіли нульової ширини й фрази, схожі на вказівки системі перевірки, коментар не відкидають: їх позначено, і їх окремо оцінює модельна перевірка безпеки подачі.
Коментар, що не пройшов, відмовляється разом із подачею: нічого не збережено — ні подачі, ні файла, ні відповідей. Покажіть студентові причину, дайте виправити коментар і надішліть подачу знову. Подачу без коментаря ці перевірки не зачіпають. У подачі файлом коментар перевіряється останнім, після файла й завдання; у подачі тесту — після відповідей.
STUDENT_NOTE_TOO_LONG¶
422. Коментар довший за 2 000 знаків; details називає його довжину. Попросіть студента
скоротити коментар.
STUDENT_NOTE_REJECTED¶
422. Коментар не пройшов текстової перевірки. details починається з категорії перевірки й
двокрапки:
| категорія | що в коментарі |
|---|---|
suspicious_unicode |
символи зміни напрямку тексту, тегові чи керівні символи; їх часто приносить текст, скопійований з іншої програми |
charset_violation |
рядок, що не є правильним Unicode, — наприклад, самотній сурогат \ud800 у JSON |
Попросіть студента переписати коментар без цього.