Интеграция с LRS

1. Загрузка цифрового следа с использованием API к LRS

1.1. Общая инструкция интеграции к LRS

Шаги интеграции ОО с LRS платформы:

  1. Запросить доступ к тестовому хранилищу LRS.
    Если вы работаете с нами по нескольким проектам, для каждого проекта нужно отдельное хранилище. Правила выдачи прав доступа описаны ниже.
  2. Протестировать передачу в LRS полного пакета стейтментов по одному пользователю. Подробно описан ниже.
    Процесс тестирования двухсторонний, с участием технических специалистов Платформы 2035 и провайдера.
  3. Запросить доступ к хранилищу LRS на промышленном контуре.
    После получения доступа вы сможете загружать ЦС на промышленном контуре.

Обратите внимание! Для работы необходимо на заключительном этапе получить доступ именно к продуктовому контуру.
Неприятная ошибка, - продолжить слать рабочие цифровые следы в тестовый контур, их придется повторно послать в промышленный контур.

1.2. Доступ к тестовому хранилищу LRS (тестовый контур)

Направьте заявку на выдачу токена письмом на электронную почту apps@2035.university:

  1. Тема: Доступ к тестовому External LRS, проект БАС, название организации.
  2. Текст: Просим выдать логин, пароль и basic auth токен к External LRS.
  3. Для какого контура: Тестовый.
  4. Организация (юридическое наименование, как в договоре).
  5. Название проекта, в рамках которого проходит интеграция.

В течение 3 дней заявка будет обработана, и вы получите письмо с информацией, необходимой для доступа.
Сразу после этого вы можете приступать к тестированию передачи ЦС.

Обратите внимание!!!

Отсутствие части информации в заявке влияет на скорость (замедляет) на работу по ней!

1.3 Тестирование авторизации LRS (тестовый контур)

В Университете 2035 используется LRS (Learning Record Store, хранилище учебных активностей) под названием «Learning Locker».

Документация на английском языке тут: http://docs.learninglocker.net/welcome/.

Интеграция с LRS Университета 2035 заключается в 2-х аспектах:

  1. Настройка инструмента оправки запросов к RESTful API на стороне LRS.
    1. Отправка фактов (цифрового следа) в LRS;
    2. Получение фактов (цифрового следа) из LRS.
  2. Настройка шаблонов отправки сообщений (xAPI) для каждого фиксируемого факта.

Перед началом подключения к API LRS вы получили параметры доступа к нему, которые должны выглядеть так:

  1. xAPI Endpoint: https://api.u2035test.ru/lrs-external/data/xAPI/
  2. Basic: ZmZjZGY4ZTkwwwMyOTc1ZTI5OWUzMDVjYzY5NWI5MmJhZTQyNTFmMTpiNzk3MDIzNWQ5MWVlNTdhMzgyYTc1ZWVlZDgyNWNlODczMmFiYjli
  3. Key: ffcdf8e906c2975e299e305cc695b92bdd4251f1
  4. Secret: b7970235d91ee57a382a75dddd825ce8732abb9b

Пояснения к параметрам:

  1. Первый параметр для всех организаций одинаковый – это адрес API тестового стенда LRS Университета 2035.
  2. Второй, третий и четвертый – индивидуальные для каждого хранилища для каждой организации (на стороне LRS для организации может быть настроено несколько хранилищ).
    Приведены измененные параметры только для того, чтобы был пример, как они должны выглядеть.
  3. Используется либо 2-й, либо и 3-й и 4-й параметры, они являются взаимозаменяемыми. 3-й и 4-й указываются в полях логин и пароль некоторых инструментов отправки REST-запросов, 2-й тоже самое только в base64-кодировке и используется в параметре Authorization заголовка запроса.

Ниже по тексту будут представлены в качестве примеров скриншоты из бесплатного инструмента работы с REST API Postman.

Обратите внимание!!!

Для проверки работоспособности вы можете использовать проект в postman, в котором собраны необходимые шаблоны для интеграции

https://www.postman.com/university2035/workspace/

В частности для проверки работоспособности полученных ключей авторизации используйте шаблон «Проверка связи».

1.4 Настройка параметров и проверка связи

Необходимо в средстве/механизме оправки REST запросов указать Адрес API (первый параметр выше + /statements).

Параметры заголовка – параметры авторизации (2 или 3,4 параметры указанные выше).

image2020-12-10_0-29-15.png

Обязательные параметры:

image2020-12-10_0-31-16.png

Для проверки связи выполните следующие действия:

  1. Отправить запрос «Get» с указанными на предыдущем этапе данными. В ответ должен вернуться статус 200 (ОК).
  2. Если данные, указанные на предыдущем шаге, неверны, то в ответ на отправленный запрос отобразится статус ошибки:
    1. не найден API, если адрес URL указан неправильно;
    2. 404 Not Found, если к адресу не добавили /statements;
    3. 400 Bad Request, если не указаны заголовки или указаны не верно (X-Experience-API-Version обязателен для любых запросов, content-type для Get не обязателен);
    4. 401 Unauthorized, если неправильно указали параметры авторизации.Для проверки связи выполните следующие действия:

image2020-12-10_0-33-21.png

3. Вторым запросом для проверки подключения к LRS отправить запрос «POST» с ранее указанными параметрами и простым сообщением в теле запроса: {"Test":"тест"}. В ответ на такой запрос должен быть получен статус 400 Bad Request телом ответа:

{
"errorId": "aa9c8065-6884-48ac-adfd-b283f49e14ad",
"warnings": [
"Missing required value in 'statements.0.actor'",
"Missing required value in 'statements.0.verb'",
"Missing required value in 'statements.0.object'",
"Unknown keys (Test) set in 'statements.0'"
]
}

Обратите внимание! Метод уже не GET, а POST

Данный ответ означает, что запрос был отправлен в LRS, но его структура не соответствует структуре xAPI, предполагающий обязательные элементы, описывающие факт: actor, verb и object.

Получение указанного ответа означает, что настройка и тестирование вашего средства/механизма отправки запросов в LRS завершено и нужно переходить к формированию корректных сообщений о фактах обучения в формате xAPI.

В дальнейшем вы можете, например, попробовать разные шаблоны из проекта Postman, чтобы познакомиться со структуру xapi и удостовериться в их работоспособности.

1.5. Доступ в промышленный контур LRS

Получение доступов на промышленный контур LRS аналогичен получению доступа к тестовому хранилищу.

Направьте заявку на выдачу токена письмом на электронную почту apps@2035.university:

  1. Тема: Доступ к продуктовому External LRS, проект БАС, название организации.
  2. Текст: Просим выдать логин, пароль и basic auth токен к External LRS.
  3. Для какого контура: Промышленный.
  4. Организация (юридическое наименование, как в договоре).
  5. Название проекта, в рамках которого проходит интеграция.
  6. Для подтверждения того, что вы успешно загрузили ЦС на тестовом контуре, вам нужно также отправить результаты загрузки, указав id стейтмента, который вы получили в ответ на отправку ЦС в LRS.

Обратите внимание!!!

Отсутствие части информации в заявке влияет на скорость (замедляет) принятия по ней решения

В течение 3 дней заявка будет обработана, и вы получите письмо с логином, паролем и секретным ключом.

2. Интеграция с S3. Работа с файлами

Для отправки артефактов используется объектное хранилище CLOUD4Y. Объектное хранилище построено на платформе компании Cloudian и поддерживает протокол доступа Amazon S3 API. В объектном хранилище данные хранятся без иерархии (каждый объект расположен в пуле данных на одном уровне). Доступ к данным возможен через API.

Алгоритм взаимодействия следующий:

  • По запросу на доступ к LRS мы также выдаем доступ к хранилищу s3, который мы используем (если его нет - запросите отдельно на apps@2035.university, указав организацию и проект).
  • Подключаетесь и работаете с ним по стандартному протоколу Amazon S3 API (описание https://docs.aws.amazon.com/en_us/AmazonS3/latest/...).
  • В ЦС в стейтменте xAPI передается ссылка на файл в этом сервисе.

В стейтменте xAPI нужно заполнить массив объектов в statement.attachments. В каждом объекте заполняется набор полей, ссылка на объект в s3 пишется в fileUrl:
usageType: string
display:
ru-RU: string
description:
ru-RU: string
contentType: string
length: int
sha2: string
fileUrl: string

Например,

{
"_id": "5e8c87aea84de709ec69af48",
"hasGeneratedId": false,
"organisation": "5e8afe645384a609880b7557",
"lrs_id": "5e8afe7e5384a609880b755b",
"client": "5e8afe7e5384a609880b755c",
"person": {
"_id": "5e8c87aee79b7e09a0c51a7e",
"display": "Василий Пупкин123"
},
"active": true,
"voided": false,
"timestamp": "2019-11-01 09:34:00",
"stored": "2020-04-07 14:01:18",
"hash": "b84db5bc2ff0e487f528c9873e8f1deb41ee59fb",
"agents": [
"https://id.2035.university|1672721"
],
"relatedAgents": [
"https://id.2035.university|1672721",
"https://id.2035.university|54272",
"https://id.2035.university|646378",
"mailto:takem08@gmail.com"
],
"registrations": [],
"verbs": [
"http://adlnet.gov/xapi/verbs/experienced"
],
"activities": [
"https://hackathon_cv.2035.university/task_12/coding_1456"
],
"relatedActivities": [
"https://hackathon_cv.2035.university/task_12/coding_1456",
"https://hackathon_cv.2035.university",
"https://hackathon_cv.2035.university/task_12"
],
"statement": {
"timestamp": "2019-11-01T12:34:00+03:00",
"id": "137ca18f-97f6-4477-981a-696fb41c6b65",
"authority": {
"objectType": "Agent",
"name": "3",
"mbox": "mailto:takem08@gmail.com"
},
"actor": {
"account": {
"name": "1672721",
"homePage": "https://id.2035.university"
},
"name": "Василий Пупкин133",
"objectType": "Agent"
},
"verb": {
"id": "http://adlnet.gov/xapi/verbs/experienced",
"display": {
"en-US": "experienced"
}
},
"object": {
"id": "https://hackathon_cv.2035.university/task_12/coding_1456",
"definition": {
"name": {
"ru-RU": "Написание кода"
},
"description": {
"ru-RU": "Создание и отладка программного кода"
},
"type": "https://id.2035.university/xapi/activities/coding",
"extensions": {
"https://id&46;2035&46;university/xapi/extension/tool": [
"OpenCV"
],
"https://id&46;2035&46;university/xapi/extension/programming-language": "C",
"https://id&46;2035&46;university/xapi/extension/dataset": "10000 фото автомобилей на снежной трассе",
"https://id&46;2035&46;university/xapi/extension/domain": "компьютерное зрение и компьютерное распознавание изображений",
"https://id&46;2035&46;university/xapi/extension/objective": "Создать систему распознавания номеров автомобилей в ветреную и снежную погоду"
}
},
"objectType": "Activity"
},
"result": {
"success": true,
"completion": true,
"duration": "PT2H44M",
"extensions": {
"https://id&46;2035&46;university/xapi/extension/competences_text": [
"Программирование на языке C",
"Быстрое вхождение в новые контексты",
"Командная работа"
],
"https://id&46;2035&46;university/xapi/extension/competences": [
"https://id.2035.university/xapi/extension/competences/set/CDO/programming",
"https://id.2035.university/xapi/extension/competences/set/softskills/team_work"
]
}
},
"context": {
"team": {
"name": "Орлы",
"member": [
{
"name": "Илья Ильич Репин",
"account": {
"name": "54272",
"homePage": "https://id.2035.university"
},
"objectType": "Agent"
},
{
"name": "Алиса Селезнева",
"account": {
"name": "646378",
"homePage": "https://id.2035.university"
},
"objectType": "Agent"
}
],
"objectType": "Group"
},
"contextActivities": {
"parent": [
{
"definition": {
"name": {
"ru-RU": "Хакатон по CV"
},
"description": {
"ru-RU": "Хакатон по компьютерному зрению и распознаванию изображений"
}
},
"id": "https://hackathon_cv.2035.university",
"objectType": "Activity"
},
{
"definition": {
"name": {
"ru-RU": "Задача 12"
},
"description": {
"ru-RU": "Задача распознавания номеров автомобиля в ветреную и снежную погоду"
}
},
"id": "https://hackathon_cv.2035.university/task_12",
"objectType": "Activity"
}
]
},
"extensions": {
"http://id&46;tincanapi&46;com/extension/observer": {
"name": "Алексей Фиксиков",
"account": {
"name": "575838",
"homePage": "https://id.2035.university"
},
"objectType": "Agent"
},
"https://id&46;2035&46;university/xapi/extension/actor-role": "Full stack программист"
}
},
"attachments": [
{
"usageType": "http://id.tincanapi.com/attachment/supporting_media",
"display": {
"ru-RU": "Программный код"
},
"description": {
"ru-RU": "Программный код для распознавания изображений в рамках датасета"
},
"contentType": "text/plain",
"length": 4681,
"sha2": "",
"fileUrl": "https://github.com/user/pupkin/cars/cv.c"
}
],
"stored": "2020-04-07T14:01:18.306Z",
"version": "1.0.0"
},
"metadata": {
"https://learninglocker&46;net/result-duration": {
"seconds": 9840
}
},
"processingQueues": [],
"personaIdentifier": "5e8c87ae02648851e13a6029",
"completedQueues": [
"STATEMENT_FORWARDING_QUEUE",
"STATEMENT_PERSON_QUEUE",
"STATEMENT_QUERYBUILDERCACHE_QUEUE"
],
"__v": 1,
"completedForwardingQueue": [],
"deadForwardingQueue": [],
"failedForwardingLog": [],
"pendingForwardingQueue": []
}