Тести й критерії через API¶
Ця сторінка — для платформ шкіл, які готують курс запитами до API, без програми автора. Якщо ви працюєте в програмі автора, вам потрібна сторінка Тести.
Як створити тест¶
Файлом. У програмі автора завантажте YAML-файл (.yaml чи .yml) у потрібний розділ курсу, як
будь-який матеріал, і оберіть тип завдання «Тест». Система не обробляє такий файл, як лекцію: вона
одразу перевіряє його й створює тест із чернеткою; сам файл не зберігається. Якщо у файлі помилка
формату, тест не створюється, а відмова називає її місце (див. Коли тест відмовлено).
Незавершений тест створюється — його можна дописати пізніше (див. Незавершена чернетка).
У програмі автора тест починають кнопкою «Новий тест» і правлять у редакторі тесту. Запити
до API нижче — довідка для платформ, які працюють із тестами без програми автора: ключ доступу вашої
школи з правом підготовки курсу (сфера PREP) — у заголовку X-API-Key, $NODE_ID — розділ курсу,
$TEST_ID — тест.
Те саме завантаження запитом — вид джерела (source_type) обов'язковий, але для тесту не важить:
curl -X POST https://api.pythoncourse.me/api/v1/nodes/$NODE_ID/documents \
-H "X-API-Key: $PREP_KEY" \
-F source_type=text -F task_type=test -F file=@lecture-3-test.yaml
Запитом. Тіло — YAML (Content-Type: application/yaml) або та сама структура в JSON
(application/json); назва (title) тут обов'язкова:
curl -X POST https://api.pythoncourse.me/api/v1/nodes/$NODE_ID/tests \
-H "X-API-Key: $PREP_KEY" -H "Content-Type: application/yaml" \
--data-binary @lecture-3-test.yaml
Відповідь 201 — тест: id (це й є $TEST_ID), title, draft — питання з номерами, варіанти з
літерами й позначками — і published: null, а поруч — поля, описані в
Що показує читання чернетки. Завантаження файлом теж повертає id тесту.
Чернетка й публікація¶
Прочитати чернетку — з літерами варіантів і позначками — і чинну версію:
curl https://api.pythoncourse.me/api/v1/tests/$TEST_ID/draft -H "X-API-Key: $PREP_KEY"
published — чинна версія: number (номер за порядком), version (позначка того, що бачить
студент) і published_at; до першої публікації — null. Решту полів — що лишилось завершити, що
знайшла перевірка, чи є неопубліковані зміни — описано в Що показує читання чернетки.
Замінити чернетку — цілком, YAML чи JSON, як при створенні:
curl -X PUT https://api.pythoncourse.me/api/v1/tests/$TEST_ID/draft \
-H "X-API-Key: $PREP_KEY" -H "Content-Type: application/yaml" \
--data-binary @lecture-3-test.yaml
Чернетка з помилкою формату не зберігається — лишається попередня; незавершена зберігається така, як
є (див. Незавершена чернетка). title у новій чернетці перейменовує тест одразу, без
публікації; без title назва лишається та сама. Решту правок студенти не бачать, поки ви не
опублікуєте чернетку. Перед публікацією її можна перевірити (див. Перевірити чернетку).
curl -X POST https://api.pythoncourse.me/api/v1/tests/$TEST_ID/publish -H "X-API-Key: $PREP_KEY"
Відповідь 201 — опубліковано нову версію; 200 — чернетка така сама, як чинна версія, і нічого не змінилося. Нова версія одразу стає тією, яку бачать і складають студенти. Пояснення мовою курсу до нових питань, варіантів чи позначок система пише під час перевірки чернетки, а якщо чернетку не перевіряли, — після публікації; публікація перевіреної чернетки бере їх готовими й нічого не доплачує (див. Пояснення).
422 TEST_DRAFT_INCOMPLETE — чернетку не завершено; нічого не
опубліковано.
409 GENERATION_IN_PROGRESS — система саме пише пояснення до цього
тесту; з публікації нічого не збережено. Зачекайте, доки вона закінчить, і опублікуйте ще раз.
Незавершена чернетка¶
Тест можна писати частинами: чернетка зберігається й без питань, з питанням без варіантів чи з одним,
без позначки correct: true, з порожнім текстом питання чи варіанта. Перевірити й опублікувати можна
лише завершену чернетку — незавершеній обидві дії відмовляють кодом
TEST_DRAFT_INCOMPLETE, і нічого не змінюється.
Що лишилось завершити, читання чернетки показує в полі incomplete — у тому порядку, у якому ви
читаєте тест: текст питання, тексти варіантів, скільки варіантів, чи позначено правильний. Кожне
місце — код, номер питання (question) і номер варіанта (option), рахуючи з 1; чого місце не
стосується, те null. Порожній перелік — чернетку завершено.
"incomplete": [
{"code": "TEST_TEXT_EMPTY", "question": 1, "option": 2},
{"code": "TEST_NO_CORRECT_OPTION", "question": 3, "option": null}
]
| код | місце | що не так | що зробити |
|---|---|---|---|
TEST_NO_QUESTIONS |
тест | питань немає | додайте питання |
TEST_TEXT_EMPTY |
питання, а коли задано option, — варіант |
порожній текст | напишіть текст |
TEST_OPTIONS_COUNT |
питання | менше двох варіантів | додайте варіанти |
TEST_NO_CORRECT_OPTION |
питання з варіантами | жоден варіант не позначено correct: true |
позначте правильні варіанти |
Перевірити чернетку¶
Перевірка показує ще до публікації, що система напише до тесту: пояснення до кожного питання мовою курсу й сумніви у ваших позначках (див. Сумнів). Перевірка нічого не публікує: студенти нічого з неї не бачать.
curl -X POST https://api.pythoncourse.me/api/v1/tests/$TEST_ID/check -H "X-API-Key: $PREP_KEY"
Відповідь 200 — стан перевірки: state, explanations і doubts, як у полі check читання
чернетки (див. Що показує читання чернетки). in_progress — система пише пояснення; коли
допише, читання чернетки покаже ready. ready — пояснення до цих самих питань, варіантів і позначок
уже написано, і вони вже у відповіді.
Скільки це коштує:
- Чернетка, до якої пояснень ще немає — нова чи змінена в питаннях, варіантах чи позначках, — одне написання пояснень: стільки ж коштувала б її публікація без перевірки.
- Незмінена чернетка, уже перевірена чи опублікована, — нічого: система віддає те, що вже написала. Повторний запит, поки перевірка йде, теж нічого не коштує.
- Публікація перевіреної чернетки нічого не доплачує, навіть поки перевірка ще йде: нова версія бере пояснення, які написала чи пише перевірка.
- Поріг заліку й ваші власні пояснення перевірки не скидають: змінивши лише їх, перевіряти знову не треба, і публікація теж нічого не доплатить.
Якщо перевірка не вдалася (failed у читанні чернетки), перевірте ще раз — система спробує заново.
Публікувати без перевірки теж можна: тоді пояснення система напише після публікації.
422 TEST_DRAFT_INCOMPLETE — чернетку не завершено; нічого не
перевірено. 409 GENERATION_IN_PROGRESS — система саме пише інші
пояснення до цього тесту; нічого не збережено — перевірте ще раз, коли вона закінчить.
Що показує читання чернетки¶
Читання чернетки — як і відповідь створення й заміни — несе, крім самої чернетки (draft) і чинної
версії (published):
incomplete— що лишилось завершити (див. Незавершена чернетка); порожній перелік — чернетку завершено.check— що знайшла перевірка чернетки такої, як вона є:state— стан перевірки (таблиця нижче),explanations— пояснення системи за номерами питань,doubts— питання, у позначках яких система сумнівається, наприклад{"2": true}(див. Сумнів). Доки стан неready,explanationsіdoubtsпорожні. Ваші власні пояснення — у самій чернетці, окремо від пояснень системи.unpublished_changes— чи дасть публікація нову версію:true, коли чернетка відрізняється від чинної версії питаннями, варіантами, позначками, порогом, вашими поясненнями чи мовою курсу, і до першої публікації. Нова назва змін не додає: її видно одразу.course_root_id— курс, у якому стоїть тест.
check.state |
що означає |
|---|---|
not_checked |
чернетку не перевіряли, змінили в питаннях, варіантах чи позначках після перевірки або ще не завершили |
in_progress |
система пише пояснення |
ready |
пояснення й сумніви написано |
failed |
пояснення написати не вдалося — перевірте ще раз |
Наприклад, так виглядають ці поля перевіреної, але ще не опублікованої чернетки:
{
"incomplete": [],
"check": {"state": "ready", "explanations": {"1": "…", "2": "…"}, "doubts": {"2": true}},
"unpublished_changes": true,
"course_root_id": "…"
}
Читання нічого не замовляє й нічого не коштує.
Пояснення¶
Пояснення до кожного питання система пише мовою курсу — один раз для тих самих питань, варіантів і позначок: коли ви перевіряєте чернетку (див. Перевірити чернетку), а якщо не перевіряли, — після публікації, що змінила питання, варіанти чи позначки. Стан пояснень чинної версії:
curl https://api.pythoncourse.me/api/v1/documents/$TEST_ID/reference -H "X-API-Key: $PREP_KEY"
Відповідь несе status: awaiting_key — тест ще не опубліковано, generating — пояснення
пишуться, ready — усе готово, failed — пояснення написати не вдалося (причину названо в
failure_reason; щоб спробувати знову, опублікуйте тест ще раз). Поруч — answers (літери
правильних варіантів чинної версії), pass_threshold, explanations (ваші власні й ті, що написала
система) і doubts (див. Сумнів). Що знайшла перевірка ще не опублікованої чернетки, цей
запит не показує — це показує читання чернетки (check, див. Що показує читання чернетки).
Вивантажити тест у YAML¶
curl https://api.pythoncourse.me/api/v1/tests/$TEST_ID/yaml -H "X-API-Key: $PREP_KEY" -o lecture-3-test.yaml
Відповідь — чернетка разом із назвою у форматі YAML, з полями в тому самому порядку, що й у прикладі на сторінці Тести. Цей файл можна виправити й завантажити назад заміною чернетки. Вивантаження несе правильні відповіді, тож його віддають лише ключем вашої школи з правом підготовки курсу; студент і платформа школи його не отримують.
Приховати тест¶
Приховайте тест кнопкою «Приховати тест» — у редакторі тесту чи в рядку тесту в дереві курсу — або
запитом DELETE /api/v1/documents/$TEST_ID. Тест зникає з курсу для студентів. Уже зроблені спроби й
рецензії на них система зберігає, але через курс студент до них більше не дістанеться.
Роль тесту змінити не можна: тест — завжди навчальний матеріал. Методичного матеріалу студенти не
бачать, тож тест тихо зник би з курсу; такий запит відмовляє кодом
TEST_OBJECT_ROLE_FIXED.
Коли тест відмовлено¶
Відмова несе в полі detail код причини й пояснення, а відмова формату — ще й місце:
{"code": "…", "details": "…", "place": {…}}. place називає рядок і стовпчик у YAML (line,
column) і номер питання й варіанта (question, option), рахуючи з 1; чого немає — null.
Відмова незавершеної чернетки замість місця несе перелік incomplete (див.
TEST_DRAFT_INCOMPLETE). Нічого з відмовленого запиту не зберігається: ні
тесту, ні зміни чернетки, ні нової версії.
TEST_YAML_UNREADABLE¶
422. YAML (чи JSON) не читається — синтаксична помилка, наприклад неоднакові відступи чи
двокрапка в тексті без лапок. place називає рядок і стовпчик. Виправте запис у цьому місці.
TEST_YAML_DUPLICATE_KEY¶
422. Те саме поле двічі в одному місці — наприклад, два text в одному варіанті. place
називає друге. Лишіть одне.
TEST_YAML_ALIAS¶
422. У файлі є якір чи посилання YAML — & чи * перед назвою. Запишіть текст повністю в
кожному місці, де він потрібен.
TEST_FIELD_INVALID¶
422. Поле невідоме чи відсутнє, назва порожня, поле не того виду (наприклад, correct: так
замість true або поріг 80.5) чи задовге. details каже, що саме не так, place — де. Виправте
поле за таблицею формату. Створення тесту запитом без title теж дає цю відмову.
TEST_OPTIONS_COUNT¶
422. У питанні понад 26 варіантів. place називає питання. Розділіть питання на кілька.
Той самий код у переліку incomplete означає інше: у питанні менше двох варіантів. Така чернетка
зберігається, але перевірити й опублікувати її можна, лише додавши варіанти (див.
Незавершена чернетка).
TEST_TOO_LARGE¶
413. Файл чи тіло запиту більші за 256 КБ. Розділіть тест на кілька.
SECURITY_REJECTED¶
400. Текст тесту містить невидимі символи (так буває з текстом, скопійованим із Word чи
вебсторінки) або фрази, схожі на вказівки системі, що пише пояснення, чи файл не вдалося прочитати як
текст. Поле category називає, що саме знайдено: suspicious_unicode, prompt_injection чи
charset_violation. Наберіть підозрілий текст заново — або збережіть файл у кодуванні UTF-8 — і
надішліть тест ще раз.
NOT_A_TEST_OBJECT¶
422. Ідентифікатор веде до іншого матеріалу вашої школи, а не до тесту, створеного в системі: наприклад, до лекції чи до тесту, колись завантаженого текстом. Перевірте ідентифікатор. Тест, завантажений текстом, відповідей більше не приймає — створіть його заново з YAML.
404 Document not found — тесту немає, його видалено або він належить іншій школі; 404
Node not found — те саме для розділу, у якому ви створюєте тест. 415 — тіло запиту не YAML і
не JSON.
TEST_DRAFT_INCOMPLETE¶
422. Перевірка чи публікація незавершеної чернетки. Замість place відмова несе перелік
incomplete — той самий, що й читання чернетки: кожне місце, яке лишилось завершити, з кодом і
номерами питання й варіанта (див. Незавершена чернетка):
{"detail": {"code": "TEST_DRAFT_INCOMPLETE", "details": "…",
"incomplete": [{"code": "TEST_NO_CORRECT_OPTION", "question": 2, "option": null}]}}
Нічого не перевірено й не опубліковано. Завершіть кожне місце з переліку, збережіть чернетку й повторіть перевірку чи публікацію.
GENERATION_IN_PROGRESS¶
409. Система саме пише пояснення до цього тесту — до іншого стану чернетки, до чинної версії чи мовою когось зі студентів. З перевірки чи публікації нічого не збережено. Зачекайте, доки вона закінчить, і повторіть запит.
Відмови завантаження й зміни матеріалу¶
Ці коди дають маршрути матеріалів — завантаження, зміна, повторна обробка, — коли справа стосується
тесту. Тіло — {"code": "…", "details": "…"}; нічого не збережено.
TEST_FILE_NOT_YAML¶
422. Матеріал із типом завдання «Тест» — не YAML-файл (.yaml, .yml), а інший файл чи
посилання. Тест із тексту чи документа Word система більше не приймає. Запишіть тест у YAML і
завантажте файлом.
TEST_OBJECT_SOURCE_RESERVED¶
422. Запит сам вказав вид джерела test_object — цей вид ставить лише система. Завантажте
YAML-файл із типом завдання «Тест» або створіть тест запитом (див. Як створити тест).
TEST_OBJECT_TYPE_FIXED¶
422. Спроба змінити тип завдання тесту, створеного в системі. Тест лишається тестом; якщо потрібне інше завдання — створіть новий матеріал.
TEST_OBJECT_ROLE_FIXED¶
422. Спроба зробити тест, створений у системі, методичним матеріалом — поставити йому роль
(material_role), відмінну від educational. Тест завжди навчальний: методичного матеріалу студенти
не бачать. Роль лишається навчальною; щоб прибрати тест від студентів, приховайте його (див.
Приховати тест).
TEST_IS_AN_OBJECT¶
422. Спроба зробити тестом наявний матеріал, змінивши його тип завдання. Тест створюється з YAML — завантажте файл або створіть тест запитом.
TEST_OBJECT_NOT_PROCESSED¶
422. Повторна обробка чи ролі файлів для тесту, створеного в системі: такий тест не обробляється, як лекція. Щоб змінити тест, змініть чернетку й опублікуйте.
KEY_LIVES_IN_TEST¶
422. Запит замінити чи прибрати ключ відповідей (PUT чи DELETE …/reference/override) для
тесту, створеного в системі. Правильні відповіді — позначки correct у самому тесті: змініть
чернетку й опублікуйте.
Критерії текстового завдання¶
Роботи студентів над текстовим завданням — коротким завданням, завданням чи проєктом — система перевіряє за переліком критеріїв. Перелік складає сама система з тексту, назви й опису завдання, опису розділу й основних понять розділу й курсу. Складає його один раз — після першої подачі роботи студентом на перевірку, — і далі кожна робота з цього завдання перевіряється за тим самим переліком. Ви можете його поправити.
Опис розділу в програмі автора — вікно «Опис вузла» — дає переліку опис розділу завдання, а основні поняття (поле «Основні концепти») — розділу завдання й курсу. Якщо перелік склали, коли опису не мав ні розділ, ні курс, система складе його ще раз — після першої подачі, що прийде, коли опис з'явиться, — і лише один раз.
Кожен критерій несе:
| поле | що це |
|---|---|
id |
позначка критерію — c1, c2, …; її ставить система |
text |
що перевірити |
evidence |
за якою ознакою видно, що виконано |
weight |
вага: must — обов'язково, should — бажано, may — можна |
check_method |
як перевірити: model_verdict — система оцінює роботу за текстом і ознакою критерію; mandatory_points — критерій виконано, коли в роботі є кожен обов'язковий пункт; code_test — перевірка запуском коду, лише в проєкті |
soft_descent |
true — перевірку запуском коду поки виконує оцінка системи: запускати код система ще не вміє |
concepts |
основні поняття, яких стосується критерій |
mandatory_points |
обов'язкові пункти — для mandatory_points; кожен має свою позначку: c1.p1, c1.p2, … |
Прочитати перелік¶
curl https://api.pythoncourse.me/api/v1/documents/$TASK_ID/criteria -H "X-API-Key: $PREP_KEY"
Відповідь несе status — чи є перелік, а якщо немає, то чому:
ready— перелік є;awaiting_first_submission— переліку ще немає, і жодна робота студента на нього не чекає;composing— система складає перелік саме зараз, це триває кілька хвилин;not_composed— переліку немає, хоча роботи студентів чекають на нього, або остання спроба скласти його не вдалася.
Поки переліку немає, message каже, що сталося й що робити, reason_code у стані not_composed —
чому переліку немає, а waiting_submissions — скільки робіт студентів чекають на перелік, щоб їх
перевірили за ним (див. Коли переліку немає). Поруч:
model— перелік, який склала система;author— ваша правка, якщо ви її зробили;in_force— перелік, за яким перевіряються роботи:layerкаже, чий він (author— ваша правка,model— перелік системи),criteria— самі критерії;contradictions— де завдання суперечить опису розділу. Це лише для вас: ні в критерії, ні в бал воно не йде;concepts— поняття, які можна назвати в критеріях.
Коли переліку немає¶
Поки жодна робота на перелік не чекає (awaiting_first_submission), message таке:
Перелік критеріїв буде складено після першої подачі роботи студентом на перевірку, після цього його можна поправити.
Поки система його складає (composing):
Перелік критеріїв складається зараз. Роботи студентів, що чекають на нього, буде перевірено, щойно він буде готовий; після цього перелік можна поправити.
Якщо переліку немає з іншої причини (not_composed), reason_code її називає, а message каже,
що робити:
reason_code |
message |
|---|---|
task_not_processed |
Перелік критеріїв ще не складено: обробку тексту завдання не завершено. Якщо обробка ще триває — дочекайтеся її завершення; якщо вона завершилася з помилкою — запустіть її знову. Після цього перелік складеться автоматично, щойно хтось зі студентів подасть роботу на це завдання, і тоді ж буде перевірено роботи, що чекають. Якщо нових робіт найближчим часом не буде — зверніться до адміністратора системи, і він запустить повторну спробу. |
models_unavailable |
Перелік критеріїв не вдалося скласти: сервіс, що його складає, був тимчасово недоступний. Від вас нічого не потрібно: повторна спроба відбудеться автоматично, щойно хтось зі студентів подасть роботу на це завдання, і тоді ж буде перевірено роботи, що чекають. Якщо нових робіт найближчим часом не буде або стан не зміниться — зверніться до адміністратора системи. |
limit_reached |
Перелік критеріїв не вдалося скласти: завдання завелике для обмежень, що зараз діють у системі. Зверніться до адміністратора системи: після зміни обмежень він запустить повторну спробу, і тоді ж буде перевірено роботи, що чекають. Не правте заради цього текст завдання: правка створить нову версію завдання й не допоможе роботам, що вже чекають. |
composition_error |
Перелік критеріїв не вдалося скласти через внутрішню помилку системи. Зверніться до адміністратора системи: після виправлення він запустить повторну спробу, і тоді ж буде перевірено роботи, що чекають. |
not_attempted |
Перелік критеріїв для поточної версії завдання ще не складався, а роботи студентів уже чекають на нього. Він складеться автоматично, щойно хтось зі студентів подасть роботу на це завдання, і тоді ж буде перевірено роботи, що чекають. Якщо нових робіт найближчим часом не буде — зверніться до адміністратора системи, і він запустить повторну спробу. |
Сьогодні робота студента, для якої переліку немає, однаково отримує рецензію — без переліку, — а
наступна подача спробує скласти його знову, тож waiting_submissions — 0. Коли перевірка
текстових завдань спиратиметься лише на перелік, робота без нього чекатиме, доки він з'явиться, і
тоді ж отримає рецензію; waiting_submissions покаже, скільки таких робіт.
Поправити перелік¶
Правку надсилають цілим переліком:
curl -X PUT https://api.pythoncourse.me/api/v1/documents/$TASK_ID/criteria/override \
-H "X-API-Key: $PREP_KEY" -H 'Content-Type: application/json' \
-d '{"criteria": [{"id": "c1", "text": "Обробляє n = 0", "evidence": "factorial(0) повертає 1", "weight": "must", "check_method": "model_verdict", "concepts": ["Рекурсія"]}, {"text": "Є базовий випадок", "evidence": "рекурсія зупиняється", "weight": "should", "check_method": "mandatory_points", "mandatory_points": [{"text": "умова зупинки"}]}]}'
- Критерій чи пункт, який ви лишаєте, надсилайте з його
id— позначка збережеться. Новий — безid: система дасть йому позначку після найбільшої в чинному переліку й у переліку системи, а новому пункту — після найбільшої серед пунктів його критерію. Критерій, якого немає в правці, з переліку прибрано. soft_descentне надсилають — його ставить система.- Поняття — лише з
conceptsчитання. - Межі: до 60 критеріїв; текст і ознака — до 600 знаків; до 10 обов'язкових пунктів на критерій, пункт — до 300 знаків; до 10 понять на критерій. Порушення межі — відмова 422, що називає поле.
- Суперечностей правка не змінює.
Правка діє для завдання в тому вигляді, у якому ви її зробили. Якщо зміниться текст завдання чи його вид, система складе новий перелік після наступної подачі, а попередня правка перестане діяти й зникне з читання — поправте новий перелік.
Скинути правку¶
curl -X DELETE https://api.pythoncourse.me/api/v1/documents/$TASK_ID/criteria/override -H "X-API-Key: $PREP_KEY"
Роботи знову перевіряються за переліком системи. Скинута правка, як і кожна замінена, лишається в системі знімком, але не діє й у читанні не показується.
Усі три запити відповідають тим самим тілом, що й читання, — тож видно, що саме тепер діє.
Коли запит відмовлено¶
Відмова несе в полі detail код причини й пояснення: {"code": "…", "details": "…"}. Нічого з
відмовленого запиту не зберігається.
| код | стан | причина | що робити |
|---|---|---|---|
NOT_A_TEXT_TASK |
422 | матеріал — тест або не завдання | тест перевіряють ваші позначки правильних відповідей (див. Редактор тесту); у матеріалу, що не є завданням, критеріїв немає |
TASK_NOT_READY |
422 | завдання ще обробляється або його прибрано з курсу | дочекайтеся кінця обробки й повторіть запит |
AWAITING_FIRST_SUBMISSION |
422 | правка, поки переліку немає | прочитайте перелік: status і message кажуть, чому його немає й що робити (див. Коли переліку немає); правте, коли status — ready |
UNKNOWN_CRITERION_ID |
422 | у правці є id критерію чи пункту, якого немає в чинному переліку |
прочитайте перелік знову й надішліть правку з його id; новий критерій надсилайте без id |
CHECK_METHOD_NOT_ADMITTED |
422 | спосіб перевірки не для цього типу завдання: code_test — лише в проєкті |
виберіть model_verdict чи mandatory_points |
UNKNOWN_CONCEPT |
422 | поняття, якого немає в concepts читання |
виберіть поняття з concepts або приберіть його |