Краткая памятка для фронтенд-разработчика. IP-сессий шлёт
backend LMS — здесь только browser SDK (/sdk.js).
<script>
window.KB2035AnomalyConfig = {
enabled: true, // feature flag LMS
apiBaseUrl: "https://anomaly.maximumtest.ru",
sdkApiKey: "<SDK_API_KEY>", // выдаёт команда anomaly-service
};
</script>
<script async src="https://anomaly.maximumtest.ru/sdk.js"></script>
Отключение: enabled: false или убрать <script src="…/sdk.js">.
Объект не пересоздавать, только мутировать поля при навигации.
window.KB2035AnomalyState = {
// обязательно для отправки событий
studentId: "12345",
studentName: "Иванов Иван",
role: "student",
// контекст курса (желательно)
courseId: "python-basic-2026",
courseTitle: "Python. Базовый уровень",
groupId: "group-001",
groupTitle: "Поток 1",
moduleId: "module-1",
moduleTitle: "Модуль 1",
teacherId: "teacher-001",
teacherName: "Петров Петр",
// текущая страница
pageType: "assignment", // assignment | test | lesson
lessonId: null,
lessonTitle: null,
assignmentId: "task-001",
assignmentTitle: "Практическое задание 1",
testId: null,
testTitle: null,
questionId: null,
};
При переходе между страницами — обновляй поля:
window.KB2035AnomalyState.pageType = "test"; window.KB2035AnomalyState.testId = "test-001"; window.KB2035AnomalyState.testTitle = "Тест 1"; window.KB2035AnomalyState.assignmentId = null; window.KB2035AnomalyState.assignmentTitle = null;
| Что | Когда |
|---|---|
page_view |
при загрузке sdk.js |
assignment_opened |
при загрузке SDK, если pageType === "assignment" |
| метрики (мышь, скролл, клавиатура, focus) | автоматически |
| summary на сервер | каждые 30 сек + при закрытии вкладки |
Все методы на window.KB2035Anomaly. Вызов безопасен через ?..
Когда: ученик нажал «Сдать задание», LMS получил результат.
window.KB2035Anomaly?.trackAssignmentSubmitted({
success: true, // если не передать — по умолчанию true
score: 85, // опционально
});
Поля assignmentId / assignmentTitle в payload — только если их
ещё нет в State.
Когда: ученик начал тест (кнопка «Начать», старт попытки).
window.KB2035Anomaly?.trackTestStarted();
// или явно:
window.KB2035Anomaly?.trackTestStarted({ testId: "test-001", testTitle: "Тест 1" });
Когда: ученик отправил ответ на вопрос («Ответить» / «Далее»).
window.KB2035Anomaly?.trackAnswerSubmitted({ questionId: "q1" });
Вызывать на каждый ответ, не один раз в конце теста.
Опционально: isCorrect, difficulty, testId,
testTitle.
Когда: ученик отправил сообщение AI-помощнику.
window.KB2035Anomaly?.trackAiAssistantRequest({
context: "lesson_help",
topic: "циклы for",
});
Когда: нужно сразу отправить накопленные метрики (до 30-сек интервала).
await window.KB2035Anomaly?.flush();
Обычно не обязателен. Имеет смысл перед редиректом после сдачи теста/задания.
Только для отладки — вернуть текущий контекст, который уйдёт в событие.
| Экран LMS | Обновить State | Вызвать метод |
|---|---|---|
| Задание (открытие) | pageType: "assignment", assignmentId, … |
— |
| Задание (сдача) | — | trackAssignmentSubmitted() |
| Тест (старт) | pageType: "test", testId, … |
trackTestStarted() |
| Тест (ответ) | questionId (опц.) |
trackAnswerSubmitted() |
| Урок / теория | pageType: "lesson", lessonId, … |
— |
| AI-чат | — | trackAiAssistantRequest() |
page_view и assignment_opened уходят только при первой загрузке SDK.trackAssignmentSubmitted.trackTestStarted и trackAnswerSubmitted.sdk.jsstudentId, studentName, role после логинаtrackAssignmentSubmitted на сдаче заданияtrackTestStarted на старте тестаtrackAnswerSubmitted на каждый ответtrackAiAssistantRequest на сообщение в AIflush() перед редиректом после важного действияИнтерактивная проверка событий и summary: /sdk-test.html