Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
- Foundry Local доступен в предварительной версии. Общедоступные предварительные выпуски предоставляют ранний доступ к функциям, которые находятся в активном развертывании.
- Функции, подходы и процессы могут изменяться или иметь ограниченные возможности до общедоступной доступности.
Foundry Local позволяет разрабатывать и интегрировать собственную службу каталогов. В этом документе приведены рекомендации по следующим вопросам:
- Формат модели, необходимый для API каталога.
- Формат запроса и ответа, необходимый для интеграции API каталога с Foundry Local.
Формат модели
Файлы модели, размещенные в каталоге моделей, должны находиться в формате Open Neural Network Exchange (ONNX) для работы с Foundry Local. Дополнительные сведения о компиляции моделей Hugging Face и PyTorch в ONNX см. в статье о компиляции моделей hugging Face, которые будут выполняться в статье Foundry Local .
Формат API
Просьба
Служба каталога должна поддерживать конечную точку POST, принимающую текст запроса JSON. Формат запроса для API каталога выглядит следующим образом:
-
Метод:
POST
-
Тип контента:
application/json
Текст запроса должен быть объектом JSON, принимаюющим следующие поля:
-
resourceIds
: массив идентификаторов ресурсов, указывающих запрашиваемые ресурсы.-
resourceId
: идентификатор ресурса. -
entityContainerType
: тип контейнера сущностей (например,Registry
,Workspace
и т. д.).
-
-
indexEntitiesRequest
: объект, содержащий параметры поиска.-
filters
: массив объектов фильтра, указывающий критерии фильтрации результатов поиска.-
field
: поле для фильтрации (например,type
,kind
и т. д.). -
operator
: оператор, используемый для фильтра. Например,eq
(равно),ne
(не равно),gt
(больше),lt
(меньше), и т. д. -
values
: массив значений для сопоставления с полем.
-
-
orderBy
: массив полей для упорядочивания результатов. -
searchText
: строка для поиска в результатах. -
pageSize
: максимальное количество возвращаемых результатов (для разбиения на страницы). -
skip
: количество пропускаемых результатов (для разбиения на страницы). -
continuationToken
: маркер для разбиения на страницы для продолжения предыдущего запроса.
-
Фильтруемые поля (необязательно)
Необходимо реализовать API каталога, который принимает формат запроса, но необязательно, чтобы реализовать фильтрацию на стороне сервера в службе каталога. Не реализация фильтрации на стороне сервера — это быстрый способ реализации службы каталога, но это может оказаться не эффективным способом поиска моделей.
Если вы решили реализовать фильтрацию на стороне сервера, можно использовать следующие поля для фильтрации результатов:
-
type
: тип модели (например,models
,datasets
и т. д.). -
kind
: тип модели (например,Versioned
,Unversioned
и т. д.). -
properties/variantInfo/variantMetadata/device
: тип устройства (например,cpu
,gpu
и т. д.). -
properties/variantInfo/variantMetadata/executionProvider
: поставщик выполнения (например,cpuexecutionprovider
,webgpuexecutionprovider
и т. д.).
Пример запроса
curl POST <your-catalog-api-endpoint> \
-H "Content-Type: application/json" \
-d '{
"resourceIds": [
{
"resourceId": "azureml",
"entityContainerType": "Registry"
}
],
"indexEntitiesRequest": {
"filters": [
{
"field": "type",
"operator": "eq",
"values": [
"models"
]
},
{
"field": "kind",
"operator": "eq",
"values": [
"Versioned"
]
},
{
"field": "properties/variantInfo/variantMetadata/device",
"operator": "eq",
"values": [
"cpu",
"gpu"
]
},
{
"field": "properties/variantInfo/variantMetadata/executionProvider",
"operator": "eq",
"values": [
"cpuexecutionprovider",
"webgpuexecutionprovider"
]
}
],
"pageSize": 10,
"skip": null,
"continuationToken": null
}
}'
Ответ
Ответ от API каталога — это объект JSON, содержащий результаты поиска. Схема ответа выглядит следующим образом:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"indexEntitiesResponse": {
"type": "object",
"properties": {
"totalCount": {
"type": "integer",
"description": "The total count of entities."
},
"value": {
"type": "array",
"description": "An array of LocalModel objects.",
"items": {
"$ref": "#/definitions/LocalModel"
}
},
"nextSkip": {
"type": "integer",
"description": "The number of items to skip for the next request."
},
"continuationToken": {
"type": "string",
"description": "A token to continue fetching results."
},
}
}
},
"definitions": {
"LocalModel": {
"type": "object",
"properties": {
"annotations": {
"type": "object",
"description": "Annotations associated with the model.",
"properties": {
"tags": {
"type": "object",
"description": "Tags associated with the annotation.",
"properties": {
"author": { "type": "string" },
"alias": { "type": "string" },
"directoryPath": { "type": "string" },
"license": { "type": "string" },
"licenseDescription": { "type": "string" },
"promptTemplate": { "type": "string" },
"task": { "type": "string" }
}
},
"systemCatalogData": {
"type": "object",
"properties": {
"publisher": { "type": "string" },
"displayName": { "type": "string" },
}
},
"name": { "type": "string" }
}
},
"properties": {
"type": "object",
"description": "Properties of the model.",
"properties": {
"name": { "type": "string" },
"version": { "type": "integer" },
"alphanumericVersion": { "type": "string" },
"variantInfo": {
"type": "object",
"properties": {
"parents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetId": { "type": "string" }
}
}
},
"variantMetadata": {
"type": "object",
"properties": {
"modelType": { "type": "string" },
"device": { "type": "string" },
"executionProvider": { "type": "string" },
"fileSizeBytes": { "type": "integer" }
}
}
}
}
}
},
"version": {
"type": "string",
"description": "The version of the model."
},
"assetId": {
"type": "string",
"description": "The asset ID of the model."
}
}
}
}
}