documentation/pages/api-module.md
2025-04-10 18:24:15 +03:00

225 lines
No EOL
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Взаимодействие с модулем через API
Доступ к модулю по API контролируется с помощью компонентов APIComponent. Есть несколько типов таких компонентов, каждый из которых отвечает за свой набор функционала.
- [Файловый API](#файловый-api)
- [ML-компонент](#ml-компонент)
- [Общая работа с пайплайнами](#общая-работа-с-пайплайнами)
- [Отдельный пайплайн](#отдельный-пайплайн)
Все API запросы работают по ссылкам вида `https://platform.stratpro.hse.ru/app-name/<api>`.
Здесь `app-name` - название приложения, оно же указано в пункте `namespace` во всех компонентах приложения.
## Файловый API
### Работа с файловым API
URL запросов к файловому API имеют вид `https://platform.stratpro.hse.ru/app-name/files/box-name/<path>`.
Здесь `box-name` - это имя компонента DataBox, к которому обращается запрос.
Файловый API позволяет загружать файлы в файловое хранилище и получать уже загруженные файлы. Загрузка папок со всем содержимым не предусмотрена, в таких случаях предполагается автоматизация запросов на загрузку отдельных файлов.
`<path>` в запросах к файловому API может быть путём как к файлу, так и к файловой группе (папке). Тип пути определяется так:
1. Если путь состоит из одного сегмента, это файловая группа. `.../files/box-name/data` - путь к файловой группе `data`.
2. Если путь состоит из нескольких сегментов, и заканчивается на `/`, это путь к файловой группе. `.../files/box-name/data/images/` - путь к файловой группе `data/images`.
3. Если путь состоит более, чем из одного сегмента, и заканчивается не на `/`, это путь к файлоу. `.../files/box-name/data/images/example.png` - путь к файлу `example.png`, расположенному в файловой группе `data/images`
Названия файлов не влияют на то, указывает ссылка на файл или на файловую группу. Например, `.../files/box-name/example.png` - это путь к файловой группе, а не файлу.
### Загрузка файлов через сервис `files`
Для загрузки файла можно использовать следующий запрос `PUT`:
```sh
curl -X PUT https://platform.stratpro.hse.ru/app-name/files/box-name/my_dir/my_file.txt -H "Content-Type: application/json" -u "developer:<password>"
```
Это запрос:
1. К приложению `app-name`.
2. К файловому API (у которого endpoint всегда `files`).
3. К ящику `box-name`.
4. К пути `my_dir/my_file.txt` внутри ящика.
5. От имени пользователя модуля `developer`, пароль которого - `<password>`.
Даже если запрос верный, сам файл на данном этапе не создаётся. Вместо этого должен прийти ответ в формате JSON:
```json
{
"name": "app-name/files/box-name/my_dir/my_file.txt",
"presigned_put_url": "<Длинная pre-signed ссылка загрузки>"
}
```
С помощью pre-signed ссылки можно уже загрузить сам файл следующим запросом:
```sh
curl -X PUT -T local/path/to/my_file.txt "<Длинная pre-signed ссылка загрузки>"
```
Здесь `local/path/to/my_file.txt` - локальный путь к файлу.
### Скачивание файлов через сервис `files`
Для скачивания нужно сделать запрос такого же формата, как для загрузки файла, но запрос GET.
```sh
curl -X GET https://platform.stratpro.hse.ru/app-name/files/box-name/my_dir/my_file.txt -H "Content-Type: application/json" -u "developer:<password>"
```
Ответ такой же, как при загрузке - pre-signed ссылка в формате json, но теперь на скачивание.
```json
{
"name": "app-name/files/box-name/my_dir/my_file.txt",
"presigned_get_url": "<Длинная pre-signed ссылка скачивания>"
}
```
GET-запрос к файловой группе возвращает список файлов, которые она содержит.
```json
{
"name": "app-name/files/box-name/my_dir/",
"files": [
{
"name": "app-name/files/box-name/my_dir/file1.png",
"presigned_get_url": "<Длинная pre-signed ссылка скачивания>"
},
{
"name": "app-name/files/box-name/my_dir/file2.txt",
"presigned_get_url": "<Длинная pre-signed ссылка скачивания>"
}
]
}
```
## ML-компонент
ML-компоненты проводят расчёты при получении соответствующих запросов и присылают результат в ответе на запрос.
Каждый развёрнутый ML-компонент содержит OpenAPI спецификацию с информацией о себе. Её можно получить следующим запросом:
```
curl -X GET https://platform.stratpro.hse.ru/app-name/API_NAME/modelversion -H "Content-Type: application/json" -u "<username>:<password>"
```
Тело запроса на выполнения расчёта - это объект с полями, которые в точности копируют поля из функции inference в [MLComponent](mlcmp.md#функция-inference).
* `inputs` - список входных данных, где каждый элемент - это словарь. Ключи словаря:
* `name` - название, произвольная строка, используется в коде модуля. Например, `"image"`.
* `datatype` - тип входных данных, одна из строк `"FP32", "FP64", "INT32", "FILE", "str", "dict"`.
* `content_type` - тип содержимого файла, если тип входной переменной `datatype` - это `"FILE"`. Обычно предполагается MIME-type. Например, `application/json`, `text/csv`. Для специализированных данных тип может быть любым - `bed`, `docx` и так далее.
* `data` - строка с путём к входному файлу или одномерный список входных данных соответствующего типа.
* `shape` - размерность входной переменной как массива, применимо даже к файлам.
* `output_fields` - список выходных данных, где каждый элемент - это словарь. Ключи словаря:
* `name`, `datatype`, `content_type` - аналогично `inputs`
* `data` - строка с путём к выходному файлу. Если передаётся `data`, результат будет записан в переданный файл. Иначе - записан во временный файл и возвращён в ответ на запрос.
* `model_parameters` - список пар `[name, value]`, произвольных параметров примитивных типов. Передаются в качестве переменной `parameters` в расчётную функцию.
### Пример запроса
Пример тела запроса к ML-компоненту
```
{
"inputs": [
{
"name": "image",
"data": "uploads/test_image.png",
"datatype": "FILE",
"content_type": "image/png",
"shape": [128, 128]
}
],
"output_fields": [
{
"name": "predict",
"datatype": "INT32"
}
]
}
```
Запрос, с файлом `data.json` в его теле и базовой аутентификацией.
```
curl -X POST -d @data.json https://platform.stratpro.hse.ru/app-name/API_NAME/predict -H "Content-Type: application/json" -u "<username>:<password>"
```
## Общая работа с пайплайнами
Каждый развёрнутый пайплайн содержит OpenAPI спецификацию запросов к себе. Её можно получить следующим запросом:
```
curl -X GET https://platform.stratpro.hse.ru/app-name/pipelines/PIPELINE_NAME/version -H "Content-Type: application/json" -u "<username>:<password>"
```
Основная работа происходит с конкретными пайплайнами. Из общих команд полезны:
```
# Получить список пайплайнов
curl -X GET https://platform.stratpro.hse.ru/app-name/pipelines -H "Content-Type: application/json" -u "<username>:<password>"
```
```
# Получить список запусков пайплайнов
curl -X GET https://platform.stratpro.hse.ru/app-name/trials -H "Content-Type: application/json" -u "<username>:<password>"
```
## Отдельный пайплайн
Пайпланы проводят расчёты при получении соответствующих запросов и сохраняют результаты в файлы.
Структура запроса на запуск пайплайна:
```
curl -X POST -d @data.json https://platform.stratpro.hse.ru/app-name/pipelines/PIPELINE_NAME/trials -H "Content-Type: application/json" -u "<username>:<password>"
```
Тело запроса на выполнения расчёта - это объект с полями, похожими на поля запроса к MLComponent.
* `inputs` - список входных данных, где каждый элемент - это словарь. Ключи словаря:
* `name` - название, произвольная строка, используется в коде модуля. Например, `"image"`.
* `datatype` - тип входных данных, одна из строк `"FP32", "FP64", "INT32", "FILE", "str", "dict"`. Должен соответствовать одному из `datatypes`, определённых в API пайплайна.
* `content_type` - тип содержимого файла, если тип входной переменной `datatype` - это `"FILE"`. Обычно предполагается MIME-type. Например, `application/json`, `text/csv`. Для специализированных данных тип может быть любым - `bed`, `docx` и так далее.
* `data` - строка с путём к входному файлу или одномерный список входных данных соответствующего типа.
* `shape` - размерность входной переменной как массива, применимо даже к файлам.
* `output_fields` - список выходных данных, где каждый элемент - это словарь. Ключи словаря:
*
* `data` - строка с путём к выходному файлу. Если передаётся `data`, результат будет записан в переданный файл. Иначе - записан во временный файл и возвращён в ответ на запрос.
* `model_parameters` - список пар `[name, value]`, произвольных параметров примитивных типов. Передаются в качестве переменной `parameters` в расчётную функцию.
```
{
"inputs": [
{
"name": "image",
"data": "pipeline_data/input/image1.png",
"datatype": "FILE",
"content_type": "image/png",
"shape": 0
}
],
"output_vars": [
{
"name": "report",
"data": "pipeline_data/output/report/"
}
]
}
```