edge-impulse-api 1.76.5 → 1.77.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/library/sdk/api/apis.d.ts +3 -1
- package/build/library/sdk/api/apis.js +3 -1
- package/build/library/sdk/api/apis.js.map +1 -1
- package/build/library/sdk/api/jobsApi.d.ts +2 -0
- package/build/library/sdk/api/jobsApi.js +4 -0
- package/build/library/sdk/api/jobsApi.js.map +1 -1
- package/build/library/sdk/api/learnApi.d.ts +26 -0
- package/build/library/sdk/api/learnApi.js +168 -0
- package/build/library/sdk/api/learnApi.js.map +1 -1
- package/build/library/sdk/api/organizationJobsApi.d.ts +2 -0
- package/build/library/sdk/api/organizationJobsApi.js +4 -0
- package/build/library/sdk/api/organizationJobsApi.js.map +1 -1
- package/build/library/sdk/api/organizationsApi.d.ts +25 -0
- package/build/library/sdk/api/organizationsApi.js +162 -0
- package/build/library/sdk/api/organizationsApi.js.map +1 -1
- package/build/library/sdk/api/vlmApi.d.ts +87 -0
- package/build/library/sdk/api/vlmApi.js +330 -0
- package/build/library/sdk/api/vlmApi.js.map +1 -0
- package/build/library/sdk/model/createMultiProjectDeploymentRequest.d.ts +28 -0
- package/build/library/sdk/model/createMultiProjectDeploymentRequest.js +34 -0
- package/build/library/sdk/model/createMultiProjectDeploymentRequest.js.map +1 -0
- package/build/library/sdk/model/createMultiProjectDeploymentRequestImpulses.d.ts +28 -0
- package/build/library/sdk/model/createMultiProjectDeploymentRequestImpulses.js +39 -0
- package/build/library/sdk/model/createMultiProjectDeploymentRequestImpulses.js.map +1 -0
- package/build/library/sdk/model/deploymentTarget.d.ts +4 -0
- package/build/library/sdk/model/deploymentTarget.js +5 -0
- package/build/library/sdk/model/deploymentTarget.js.map +1 -1
- package/build/library/sdk/model/deploymentTargetEngine.d.ts +1 -1
- package/build/library/sdk/model/deploymentTargetEngine.js +1 -1
- package/build/library/sdk/model/deploymentTargetEngine.js.map +1 -1
- package/build/library/sdk/model/impulseType.d.ts +2 -2
- package/build/library/sdk/model/impulseType.js +1 -1
- package/build/library/sdk/model/impulseType.js.map +1 -1
- package/build/library/sdk/model/learnBlockType.d.ts +1 -1
- package/build/library/sdk/model/learnBlockType.js +1 -1
- package/build/library/sdk/model/learnBlockType.js.map +1 -1
- package/build/library/sdk/model/models.d.ts +23 -0
- package/build/library/sdk/model/models.js +68 -0
- package/build/library/sdk/model/models.js.map +1 -1
- package/build/library/sdk/model/optimizeConfigSearchSpaceTemplate.d.ts +1 -1
- package/build/library/sdk/model/optimizeConfigSearchSpaceTemplate.js +1 -1
- package/build/library/sdk/model/optimizeConfigSearchSpaceTemplate.js.map +1 -1
- package/build/library/sdk/model/permission.d.ts +1 -1
- package/build/library/sdk/model/permission.js +1 -1
- package/build/library/sdk/model/permission.js.map +1 -1
- package/build/library/sdk/model/projectDeploymentTarget.d.ts +4 -0
- package/build/library/sdk/model/projectDeploymentTarget.js +5 -0
- package/build/library/sdk/model/projectDeploymentTarget.js.map +1 -1
- package/build/library/sdk/model/vlmCandidateLabelItem.d.ts +26 -0
- package/build/library/sdk/model/vlmCandidateLabelItem.js +34 -0
- package/build/library/sdk/model/vlmCandidateLabelItem.js.map +1 -0
- package/build/library/sdk/model/vlmCandidateLabelMap.d.ts +27 -0
- package/build/library/sdk/model/vlmCandidateLabelMap.js +34 -0
- package/build/library/sdk/model/vlmCandidateLabelMap.js.map +1 -0
- package/build/library/sdk/model/vlmConfigResponse.d.ts +34 -0
- package/build/library/sdk/model/vlmConfigResponse.js +39 -0
- package/build/library/sdk/model/vlmConfigResponse.js.map +1 -0
- package/build/library/sdk/model/vlmConfigResponseAllOf.d.ts +29 -0
- package/build/library/sdk/model/vlmConfigResponseAllOf.js +32 -0
- package/build/library/sdk/model/vlmConfigResponseAllOf.js.map +1 -0
- package/build/library/sdk/model/vlmConfiguration.d.ts +36 -0
- package/build/library/sdk/model/vlmConfiguration.js +54 -0
- package/build/library/sdk/model/vlmConfiguration.js.map +1 -0
- package/build/library/sdk/model/vlmConfigurationAllOf.d.ts +28 -0
- package/build/library/sdk/model/vlmConfigurationAllOf.js +29 -0
- package/build/library/sdk/model/vlmConfigurationAllOf.js.map +1 -0
- package/build/library/sdk/model/vlmConfigurationBase.d.ts +32 -0
- package/build/library/sdk/model/vlmConfigurationBase.js +49 -0
- package/build/library/sdk/model/vlmConfigurationBase.js.map +1 -0
- package/build/library/sdk/model/vlmGetAllModelsResponse.d.ts +34 -0
- package/build/library/sdk/model/vlmGetAllModelsResponse.js +39 -0
- package/build/library/sdk/model/vlmGetAllModelsResponse.js.map +1 -0
- package/build/library/sdk/model/vlmGetAllModelsResponseAllOf.d.ts +26 -0
- package/build/library/sdk/model/vlmGetAllModelsResponseAllOf.js +29 -0
- package/build/library/sdk/model/vlmGetAllModelsResponseAllOf.js.map +1 -0
- package/build/library/sdk/model/vlmGetInferenceResultsResponse.d.ts +38 -0
- package/build/library/sdk/model/vlmGetInferenceResultsResponse.js +44 -0
- package/build/library/sdk/model/vlmGetInferenceResultsResponse.js.map +1 -0
- package/build/library/sdk/model/vlmInferenceRequest.d.ts +27 -0
- package/build/library/sdk/model/vlmInferenceRequest.js +34 -0
- package/build/library/sdk/model/vlmInferenceRequest.js.map +1 -0
- package/build/library/sdk/model/vlmInferenceResults.d.ts +30 -0
- package/build/library/sdk/model/vlmInferenceResults.js +34 -0
- package/build/library/sdk/model/vlmInferenceResults.js.map +1 -0
- package/build/library/sdk/model/vlmInferenceResultsResults.d.ts +32 -0
- package/build/library/sdk/model/vlmInferenceResultsResults.js +34 -0
- package/build/library/sdk/model/vlmInferenceResultsResults.js.map +1 -0
- package/build/library/sdk/model/vlmMetadata.d.ts +32 -0
- package/build/library/sdk/model/vlmMetadata.js +39 -0
- package/build/library/sdk/model/vlmMetadata.js.map +1 -0
- package/build/library/sdk/model/vlmModel.d.ts +38 -0
- package/build/library/sdk/model/vlmModel.js +64 -0
- package/build/library/sdk/model/vlmModel.js.map +1 -0
- package/build/library/sdk/model/vlmModelType.d.ts +13 -0
- package/build/library/sdk/model/vlmModelType.js +16 -0
- package/build/library/sdk/model/vlmModelType.js.map +1 -0
- package/build/library/sdk/model/vlmPromptComponent.d.ts +32 -0
- package/build/library/sdk/model/vlmPromptComponent.js +34 -0
- package/build/library/sdk/model/vlmPromptComponent.js.map +1 -0
- package/build/library/sdk/model/vlmPromptComponentConfig.d.ts +27 -0
- package/build/library/sdk/model/vlmPromptComponentConfig.js +34 -0
- package/build/library/sdk/model/vlmPromptComponentConfig.js.map +1 -0
- package/build/library/sdk/model/vlmPromptConfigParamItem.d.ts +26 -0
- package/build/library/sdk/model/vlmPromptConfigParamItem.js +34 -0
- package/build/library/sdk/model/vlmPromptConfigParamItem.js.map +1 -0
- package/build/library/sdk/model/vlmPromptConfigParameters.d.ts +27 -0
- package/build/library/sdk/model/vlmPromptConfigParameters.js +34 -0
- package/build/library/sdk/model/vlmPromptConfigParameters.js.map +1 -0
- package/build/library/sdk/model/vlmSetConfigResponse.d.ts +25 -0
- package/build/library/sdk/model/vlmSetConfigResponse.js +24 -0
- package/build/library/sdk/model/vlmSetConfigResponse.js.map +1 -0
- package/package.json +1 -1
|
@@ -27,6 +27,9 @@ import { StartJobResponse } from '../model/startJobResponse';
|
|
|
27
27
|
import { TestPretrainedModelImagesRequest } from '../model/testPretrainedModelImagesRequest';
|
|
28
28
|
import { TestPretrainedModelRequest } from '../model/testPretrainedModelRequest';
|
|
29
29
|
import { TestPretrainedModelResponse } from '../model/testPretrainedModelResponse';
|
|
30
|
+
import { VlmConfigResponse } from '../model/vlmConfigResponse';
|
|
31
|
+
import { VlmConfigurationBase } from '../model/vlmConfigurationBase';
|
|
32
|
+
import { VlmSetConfigResponse } from '../model/vlmSetConfigResponse';
|
|
30
33
|
import { Authentication } from '../model/models';
|
|
31
34
|
import { ApiKeyAuth, OAuth } from '../model/models';
|
|
32
35
|
import { RequestFile } from './apis';
|
|
@@ -285,6 +288,17 @@ export declare class LearnApi {
|
|
|
285
288
|
[name: string]: string;
|
|
286
289
|
};
|
|
287
290
|
}): Promise<GetPretrainedModelResponse>;
|
|
291
|
+
/**
|
|
292
|
+
* Get config for a VLM learn block, including prompt and other model parameters
|
|
293
|
+
* @summary Get VLM block config
|
|
294
|
+
* @param projectId Project ID
|
|
295
|
+
* @param learnId Learn Block ID, use the impulse functions to retrieve the ID
|
|
296
|
+
*/
|
|
297
|
+
getVlmConfig(projectId: number, learnId: number, options?: {
|
|
298
|
+
headers: {
|
|
299
|
+
[name: string]: string;
|
|
300
|
+
};
|
|
301
|
+
}): Promise<VlmConfigResponse>;
|
|
288
302
|
/**
|
|
289
303
|
* Returns the latency, RAM and ROM used for the pretrained model - upload first via `uploadPretrainedModel`. This is using the project\'s selected latency device. Updates are streamed over the websocket API (or can be retrieved through the /stdout endpoint). Use getProfileTfliteJobResult to get the results when the job is completed.
|
|
290
304
|
* @summary Profile pretrained model
|
|
@@ -332,6 +346,18 @@ export declare class LearnApi {
|
|
|
332
346
|
[name: string]: string;
|
|
333
347
|
};
|
|
334
348
|
}): Promise<GenericApiResponse>;
|
|
349
|
+
/**
|
|
350
|
+
* Update config for a VLM learn block, including prompt and other model parameters.
|
|
351
|
+
* @summary Set VLM block config
|
|
352
|
+
* @param projectId Project ID
|
|
353
|
+
* @param learnId Learn Block ID, use the impulse functions to retrieve the ID
|
|
354
|
+
* @param vlmConfigurationBase
|
|
355
|
+
*/
|
|
356
|
+
setVlmConfig(projectId: number, learnId: number, vlmConfigurationBase: VlmConfigurationBase, options?: {
|
|
357
|
+
headers: {
|
|
358
|
+
[name: string]: string;
|
|
359
|
+
};
|
|
360
|
+
}): Promise<VlmSetConfigResponse>;
|
|
335
361
|
/**
|
|
336
362
|
* Starts an asynchronous profiling job, if there\'s no profiling information for the currently selected latency device. Afterwards, re-fetch model metadata to get the profiling job IDs.
|
|
337
363
|
* @summary Start a profile job for an anomaly learn block
|
|
@@ -1417,6 +1417,87 @@ class LearnApi {
|
|
|
1417
1417
|
});
|
|
1418
1418
|
});
|
|
1419
1419
|
}
|
|
1420
|
+
/**
|
|
1421
|
+
* Get config for a VLM learn block, including prompt and other model parameters
|
|
1422
|
+
* @summary Get VLM block config
|
|
1423
|
+
* @param projectId Project ID
|
|
1424
|
+
* @param learnId Learn Block ID, use the impulse functions to retrieve the ID
|
|
1425
|
+
*/
|
|
1426
|
+
async getVlmConfig(projectId, learnId, options = { headers: {} }) {
|
|
1427
|
+
const localVarPath = this.basePath + '/api/{projectId}/training/vlm/{learnId}'
|
|
1428
|
+
.replace('{' + 'projectId' + '}', encodeURIComponent(String(projectId)))
|
|
1429
|
+
.replace('{' + 'learnId' + '}', encodeURIComponent(String(learnId)));
|
|
1430
|
+
let localVarQueryParameters = {};
|
|
1431
|
+
let localVarHeaderParams = Object.assign({
|
|
1432
|
+
'User-Agent': 'edgeimpulse-api nodejs'
|
|
1433
|
+
}, this.defaultHeaders);
|
|
1434
|
+
const produces = ['application/json'];
|
|
1435
|
+
// give precedence to 'application/json'
|
|
1436
|
+
if (produces.indexOf('application/json') >= 0) {
|
|
1437
|
+
localVarHeaderParams.Accept = 'application/json';
|
|
1438
|
+
}
|
|
1439
|
+
else {
|
|
1440
|
+
localVarHeaderParams.Accept = produces.join(',');
|
|
1441
|
+
}
|
|
1442
|
+
let localVarFormParams = {};
|
|
1443
|
+
// verify required parameter 'projectId' is not null or undefined
|
|
1444
|
+
if (projectId === null || projectId === undefined) {
|
|
1445
|
+
throw new Error('Required parameter projectId was null or undefined when calling getVlmConfig.');
|
|
1446
|
+
}
|
|
1447
|
+
// verify required parameter 'learnId' is not null or undefined
|
|
1448
|
+
if (learnId === null || learnId === undefined) {
|
|
1449
|
+
throw new Error('Required parameter learnId was null or undefined when calling getVlmConfig.');
|
|
1450
|
+
}
|
|
1451
|
+
Object.assign(localVarHeaderParams, options.headers);
|
|
1452
|
+
Object.assign(localVarHeaderParams, this.opts.extraHeaders);
|
|
1453
|
+
let localVarUseFormData = false;
|
|
1454
|
+
let localVarRequestOptions = {
|
|
1455
|
+
method: 'GET',
|
|
1456
|
+
qs: localVarQueryParameters,
|
|
1457
|
+
headers: localVarHeaderParams,
|
|
1458
|
+
uri: localVarPath,
|
|
1459
|
+
useQuerystring: this._useQuerystring,
|
|
1460
|
+
agentOptions: { keepAlive: false },
|
|
1461
|
+
json: true,
|
|
1462
|
+
};
|
|
1463
|
+
let authenticationPromise = Promise.resolve();
|
|
1464
|
+
authenticationPromise = authenticationPromise.then(() => this.authentications.ApiKeyAuthentication.applyToRequest(localVarRequestOptions));
|
|
1465
|
+
authenticationPromise = authenticationPromise.then(() => this.authentications.JWTAuthentication.applyToRequest(localVarRequestOptions));
|
|
1466
|
+
authenticationPromise = authenticationPromise.then(() => this.authentications.JWTHttpHeaderAuthentication.applyToRequest(localVarRequestOptions));
|
|
1467
|
+
authenticationPromise = authenticationPromise.then(() => this.authentications.OAuth2.applyToRequest(localVarRequestOptions));
|
|
1468
|
+
authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
|
|
1469
|
+
return authenticationPromise.then(() => {
|
|
1470
|
+
if (Object.keys(localVarFormParams).length) {
|
|
1471
|
+
if (localVarUseFormData) {
|
|
1472
|
+
localVarRequestOptions.formData = localVarFormParams;
|
|
1473
|
+
}
|
|
1474
|
+
else {
|
|
1475
|
+
localVarRequestOptions.form = localVarFormParams;
|
|
1476
|
+
}
|
|
1477
|
+
}
|
|
1478
|
+
return new Promise((resolve, reject) => {
|
|
1479
|
+
localVarRequest(localVarRequestOptions, (error, response, body) => {
|
|
1480
|
+
if (error) {
|
|
1481
|
+
reject(error);
|
|
1482
|
+
}
|
|
1483
|
+
else {
|
|
1484
|
+
body = models_1.ObjectSerializer.deserialize(body, "VlmConfigResponse");
|
|
1485
|
+
if (typeof body.success === 'boolean' && !body.success) {
|
|
1486
|
+
const errString = `Failed to call "${localVarPath}", returned ${response.statusCode}: ` + response.body;
|
|
1487
|
+
reject(new Error(body.error || errString));
|
|
1488
|
+
}
|
|
1489
|
+
else if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
|
|
1490
|
+
resolve(body);
|
|
1491
|
+
}
|
|
1492
|
+
else {
|
|
1493
|
+
const errString = `Failed to call "${localVarPath}", returned ${response.statusCode}: ` + response.body;
|
|
1494
|
+
reject(errString);
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
});
|
|
1498
|
+
});
|
|
1499
|
+
});
|
|
1500
|
+
}
|
|
1420
1501
|
/**
|
|
1421
1502
|
* Returns the latency, RAM and ROM used for the pretrained model - upload first via `uploadPretrainedModel`. This is using the project\'s selected latency device. Updates are streamed over the websocket API (or can be retrieved through the /stdout endpoint). Use getProfileTfliteJobResult to get the results when the job is completed.
|
|
1422
1503
|
* @summary Profile pretrained model
|
|
@@ -1755,6 +1836,93 @@ class LearnApi {
|
|
|
1755
1836
|
});
|
|
1756
1837
|
});
|
|
1757
1838
|
}
|
|
1839
|
+
/**
|
|
1840
|
+
* Update config for a VLM learn block, including prompt and other model parameters.
|
|
1841
|
+
* @summary Set VLM block config
|
|
1842
|
+
* @param projectId Project ID
|
|
1843
|
+
* @param learnId Learn Block ID, use the impulse functions to retrieve the ID
|
|
1844
|
+
* @param vlmConfigurationBase
|
|
1845
|
+
*/
|
|
1846
|
+
async setVlmConfig(projectId, learnId, vlmConfigurationBase, options = { headers: {} }) {
|
|
1847
|
+
const localVarPath = this.basePath + '/api/{projectId}/training/vlm/{learnId}'
|
|
1848
|
+
.replace('{' + 'projectId' + '}', encodeURIComponent(String(projectId)))
|
|
1849
|
+
.replace('{' + 'learnId' + '}', encodeURIComponent(String(learnId)));
|
|
1850
|
+
let localVarQueryParameters = {};
|
|
1851
|
+
let localVarHeaderParams = Object.assign({
|
|
1852
|
+
'User-Agent': 'edgeimpulse-api nodejs'
|
|
1853
|
+
}, this.defaultHeaders);
|
|
1854
|
+
const produces = ['application/json'];
|
|
1855
|
+
// give precedence to 'application/json'
|
|
1856
|
+
if (produces.indexOf('application/json') >= 0) {
|
|
1857
|
+
localVarHeaderParams.Accept = 'application/json';
|
|
1858
|
+
}
|
|
1859
|
+
else {
|
|
1860
|
+
localVarHeaderParams.Accept = produces.join(',');
|
|
1861
|
+
}
|
|
1862
|
+
let localVarFormParams = {};
|
|
1863
|
+
// verify required parameter 'projectId' is not null or undefined
|
|
1864
|
+
if (projectId === null || projectId === undefined) {
|
|
1865
|
+
throw new Error('Required parameter projectId was null or undefined when calling setVlmConfig.');
|
|
1866
|
+
}
|
|
1867
|
+
// verify required parameter 'learnId' is not null or undefined
|
|
1868
|
+
if (learnId === null || learnId === undefined) {
|
|
1869
|
+
throw new Error('Required parameter learnId was null or undefined when calling setVlmConfig.');
|
|
1870
|
+
}
|
|
1871
|
+
// verify required parameter 'vlmConfigurationBase' is not null or undefined
|
|
1872
|
+
if (vlmConfigurationBase === null || vlmConfigurationBase === undefined) {
|
|
1873
|
+
throw new Error('Required parameter vlmConfigurationBase was null or undefined when calling setVlmConfig.');
|
|
1874
|
+
}
|
|
1875
|
+
Object.assign(localVarHeaderParams, options.headers);
|
|
1876
|
+
Object.assign(localVarHeaderParams, this.opts.extraHeaders);
|
|
1877
|
+
let localVarUseFormData = false;
|
|
1878
|
+
let localVarRequestOptions = {
|
|
1879
|
+
method: 'POST',
|
|
1880
|
+
qs: localVarQueryParameters,
|
|
1881
|
+
headers: localVarHeaderParams,
|
|
1882
|
+
uri: localVarPath,
|
|
1883
|
+
useQuerystring: this._useQuerystring,
|
|
1884
|
+
agentOptions: { keepAlive: false },
|
|
1885
|
+
json: true,
|
|
1886
|
+
body: models_1.ObjectSerializer.serialize(vlmConfigurationBase, "VlmConfigurationBase")
|
|
1887
|
+
};
|
|
1888
|
+
let authenticationPromise = Promise.resolve();
|
|
1889
|
+
authenticationPromise = authenticationPromise.then(() => this.authentications.ApiKeyAuthentication.applyToRequest(localVarRequestOptions));
|
|
1890
|
+
authenticationPromise = authenticationPromise.then(() => this.authentications.JWTAuthentication.applyToRequest(localVarRequestOptions));
|
|
1891
|
+
authenticationPromise = authenticationPromise.then(() => this.authentications.JWTHttpHeaderAuthentication.applyToRequest(localVarRequestOptions));
|
|
1892
|
+
authenticationPromise = authenticationPromise.then(() => this.authentications.OAuth2.applyToRequest(localVarRequestOptions));
|
|
1893
|
+
authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(localVarRequestOptions));
|
|
1894
|
+
return authenticationPromise.then(() => {
|
|
1895
|
+
if (Object.keys(localVarFormParams).length) {
|
|
1896
|
+
if (localVarUseFormData) {
|
|
1897
|
+
localVarRequestOptions.formData = localVarFormParams;
|
|
1898
|
+
}
|
|
1899
|
+
else {
|
|
1900
|
+
localVarRequestOptions.form = localVarFormParams;
|
|
1901
|
+
}
|
|
1902
|
+
}
|
|
1903
|
+
return new Promise((resolve, reject) => {
|
|
1904
|
+
localVarRequest(localVarRequestOptions, (error, response, body) => {
|
|
1905
|
+
if (error) {
|
|
1906
|
+
reject(error);
|
|
1907
|
+
}
|
|
1908
|
+
else {
|
|
1909
|
+
body = models_1.ObjectSerializer.deserialize(body, "VlmSetConfigResponse");
|
|
1910
|
+
if (typeof body.success === 'boolean' && !body.success) {
|
|
1911
|
+
const errString = `Failed to call "${localVarPath}", returned ${response.statusCode}: ` + response.body;
|
|
1912
|
+
reject(new Error(body.error || errString));
|
|
1913
|
+
}
|
|
1914
|
+
else if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
|
|
1915
|
+
resolve(body);
|
|
1916
|
+
}
|
|
1917
|
+
else {
|
|
1918
|
+
const errString = `Failed to call "${localVarPath}", returned ${response.statusCode}: ` + response.body;
|
|
1919
|
+
reject(errString);
|
|
1920
|
+
}
|
|
1921
|
+
}
|
|
1922
|
+
});
|
|
1923
|
+
});
|
|
1924
|
+
});
|
|
1925
|
+
}
|
|
1758
1926
|
/**
|
|
1759
1927
|
* Starts an asynchronous profiling job, if there\'s no profiling information for the currently selected latency device. Afterwards, re-fetch model metadata to get the profiling job IDs.
|
|
1760
1928
|
* @summary Start a profile job for an anomaly learn block
|