redisai-js
Version:
A high-performance Typescript client for RedisAI
997 lines • 66.8 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var client_1 = require("../src/client");
var redis_1 = require("redis");
var tensor_1 = require("../src/tensor");
var dtype_1 = require("../src/dtype");
require("mocha");
var chai_1 = require("chai");
var model_1 = require("../src/model");
var fs = __importStar(require("fs"));
var backend_1 = require("../src/backend");
var script_1 = require("../src/script");
var src_1 = require("../src");
var util_1 = __importDefault(require("util"));
// tslint:disable-next-line:no-var-requires
var Jimp = require('jimp');
var mochaAsync = function (fn) {
return function (done) {
fn.call().then(done, function (err) {
done(err);
});
};
};
it('test vanilla client access', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
return [4 /*yield*/, util_1.default.promisify(aiclient.client.set).bind(aiclient.client)('redisai-js-foo', 'foo')];
case 1:
result = _a.sent();
chai_1.expect(result).to.equal('OK');
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.tensorset positive testing without data', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, tensor, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
tensor = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 1], null);
return [4 /*yield*/, aiclient.tensorset('t1', tensor)];
case 1:
result = _a.sent();
chai_1.expect(result).to.equal('OK');
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.tensorset positive testing with data', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, tensor, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
tensor = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [3, 5]);
return [4 /*yield*/, aiclient.tensorset('t1', tensor)];
case 1:
result = _a.sent();
chai_1.expect(result).to.equal('OK');
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.tensorset negative testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, tensor, result, e_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
tensor = new tensor_1.Tensor(dtype_1.Dtype.float32, [-1, 1], null);
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, aiclient.tensorset('t1', tensor)];
case 2:
result = _a.sent();
return [3 /*break*/, 4];
case 3:
e_1 = _a.sent();
chai_1.expect(e_1.toString()).to.equal('ReplyError: ERR invalid or negative value found in tensor shape');
return [3 /*break*/, 4];
case 4:
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.tensorset/ai.tensorget positive testing with data', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, tensor, result, tensorg, i;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
tensor = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [3, 5]);
return [4 /*yield*/, aiclient.tensorset('t1', tensor)];
case 1:
result = _a.sent();
chai_1.expect(result).to.equal('OK');
return [4 /*yield*/, aiclient.tensorget('t1')];
case 2:
tensorg = _a.sent();
for (i = 0; i < tensor.data.length; i++) {
chai_1.expect(tensorg.data[i]).to.equal(tensor.data[i]);
}
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.tensorset/ai.tensorget positive testing with default data', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, tensor, result, tensorg, i;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
tensor = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], null);
return [4 /*yield*/, aiclient.tensorset('t1', tensor)];
case 1:
result = _a.sent();
chai_1.expect(result).to.equal('OK');
return [4 /*yield*/, aiclient.tensorget('t1')];
case 2:
tensorg = _a.sent();
for (i = 0; i < tensorg.data.length; i++) {
chai_1.expect(tensorg.data[i]).to.equal(0);
}
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.tensorget positive/negative testing on response parsing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var mockedTensorGetReply, result, e_2, mockedTensorGetReply2, result12, e_3, mockedTensorGetReply3, result3, e_4, mockedTensorGetReply4, result4, e_5, mockedTensorGetReply5, tensor;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
mockedTensorGetReply = [];
return [4 /*yield*/, tensor_1.Tensor.NewTensorFromTensorGetReply(mockedTensorGetReply)];
case 1:
result = _a.sent();
return [3 /*break*/, 3];
case 2:
e_2 = _a.sent();
chai_1.expect(e_2.toString()).to.equal('Error: AI.TENSORGET reply did not had the full elements to build the Tensor. Missing dtype,shape,values.');
return [3 /*break*/, 3];
case 3:
_a.trys.push([3, 5, , 6]);
mockedTensorGetReply2 = ['shape', [1], 'values', [10]];
return [4 /*yield*/, tensor_1.Tensor.NewTensorFromTensorGetReply(mockedTensorGetReply2)];
case 4:
result12 = _a.sent();
return [3 /*break*/, 6];
case 5:
e_3 = _a.sent();
chai_1.expect(e_3.toString()).to.equal('Error: AI.TENSORGET reply did not had the full elements to build the Tensor. Missing dtype.');
return [3 /*break*/, 6];
case 6:
_a.trys.push([6, 8, , 9]);
mockedTensorGetReply3 = ['dtype', 'FLOAT', 'values', [10]];
return [4 /*yield*/, tensor_1.Tensor.NewTensorFromTensorGetReply(mockedTensorGetReply3)];
case 7:
result3 = _a.sent();
return [3 /*break*/, 9];
case 8:
e_4 = _a.sent();
chai_1.expect(e_4.toString()).to.equal('Error: AI.TENSORGET reply did not had the full elements to build the Tensor. Missing shape.');
return [3 /*break*/, 9];
case 9:
_a.trys.push([9, 11, , 12]);
mockedTensorGetReply4 = ['dtype', 'FLOAT', 'shape', [1]];
return [4 /*yield*/, tensor_1.Tensor.NewTensorFromTensorGetReply(mockedTensorGetReply4)];
case 10:
result4 = _a.sent();
return [3 /*break*/, 12];
case 11:
e_5 = _a.sent();
chai_1.expect(e_5.toString()).to.equal('Error: AI.TENSORGET reply did not had the full elements to build the Tensor. Missing values.');
return [3 /*break*/, 12];
case 12:
mockedTensorGetReply5 = ['dtype', 'FLOAT', 'shape', [1], 'values', [10]];
return [4 /*yield*/, tensor_1.Tensor.NewTensorFromTensorGetReply(mockedTensorGetReply5)];
case 13:
tensor = _a.sent();
chai_1.expect(tensor.data[0]).to.closeTo(10.0, 0.1);
return [2 /*return*/];
}
});
}); }));
it('ai.tensorset/ai.tensorget positive testing with default data', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, inputImage, imageWidth, imageHeight, image, helpers, normalized, buffer, tensor, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
return [4 /*yield*/, Jimp.read('./tests/test_data/panda-224x224.jpg')];
case 1:
inputImage = _a.sent();
imageWidth = 224;
imageHeight = 224;
image = inputImage.cover(imageWidth, imageHeight);
helpers = new src_1.Helpers();
normalized = helpers.normalizeRGB(image.bitmap.data);
buffer = Buffer.from(normalized.buffer);
tensor = new tensor_1.Tensor(dtype_1.Dtype.float32, [imageWidth, imageHeight, 3], buffer);
return [4 /*yield*/, aiclient.tensorset('tensor-image', tensor)];
case 2:
result = _a.sent();
chai_1.expect(result).to.equal('OK');
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.tensorget negative testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, result, e_6;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, aiclient.tensorget('dontexist')];
case 2:
result = _a.sent();
return [3 /*break*/, 4];
case 3:
e_6 = _a.sent();
chai_1.expect(e_6.toString()).to.equal('ReplyError: ERR tensor key is empty');
return [3 /*break*/, 4];
case 4:
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.modelset modelOnnx linear_iris testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, modelBlobOnnx, modelOnnx, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
modelBlobOnnx = fs.readFileSync('./tests/test_data/linear_iris.onnx');
modelOnnx = new model_1.Model(backend_1.Backend.ONNX, 'CPU', [], [], modelBlobOnnx);
return [4 /*yield*/, aiclient.modelset('modelOnnx', modelOnnx)];
case 1:
result = _a.sent();
chai_1.expect(result).to.equal('OK');
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.modelset modelOnnx mnist testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, modelBlobOnnx, modelOnnx, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
modelBlobOnnx = fs.readFileSync('./tests/test_data/mnist.onnx');
modelOnnx = new model_1.Model(backend_1.Backend.ONNX, 'CPU', [], [], modelBlobOnnx);
return [4 /*yield*/, aiclient.modelset('mnist', modelOnnx)];
case 1:
result = _a.sent();
chai_1.expect(result).to.equal('OK');
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.modelset positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, modelBlob, model, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
modelBlob = fs.readFileSync('./tests/test_data/graph.pb');
model = new model_1.Model(backend_1.Backend.TF, 'CPU', ['a', 'b'], ['c'], modelBlob);
return [4 /*yield*/, aiclient.modelset('m1', model)];
case 1:
result = _a.sent();
chai_1.expect(result).to.equal('OK');
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.modelset tiny-yolo-voc testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, modelBlob, model, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
modelBlob = fs.readFileSync('./tests/test_data/tiny-yolo-voc.pb');
model = new model_1.Model(backend_1.Backend.TF, 'CPU', ['input'], ['output'], modelBlob);
return [4 /*yield*/, aiclient.modelset('tiny-yolo-voc', model)];
case 1:
result = _a.sent();
chai_1.expect(result).to.equal('OK');
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.modelrun positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, tensorA, resultA, tensorB, resultB, modelBlob, model, resultModelSet, resultModelRun, tensorC;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
tensorA = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [2, 3]);
return [4 /*yield*/, aiclient.tensorset('tensorA', tensorA)];
case 1:
resultA = _a.sent();
chai_1.expect(resultA).to.equal('OK');
tensorB = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [3, 5]);
return [4 /*yield*/, aiclient.tensorset('tensorB', tensorB)];
case 2:
resultB = _a.sent();
chai_1.expect(resultB).to.equal('OK');
modelBlob = fs.readFileSync('./tests/test_data/graph.pb');
model = new model_1.Model(backend_1.Backend.TF, 'CPU', ['a', 'b'], ['c'], modelBlob);
return [4 /*yield*/, aiclient.modelset('mymodel', model)];
case 3:
resultModelSet = _a.sent();
chai_1.expect(resultModelSet).to.equal('OK');
return [4 /*yield*/, aiclient.modelrun('mymodel', ['tensorA', 'tensorB'], ['tensorC'])];
case 4:
resultModelRun = _a.sent();
chai_1.expect(resultModelRun).to.equal('OK');
return [4 /*yield*/, aiclient.tensorget('tensorC')];
case 5:
tensorC = _a.sent();
chai_1.expect(tensorC.data[0]).to.closeTo(6.0, 0.1);
chai_1.expect(tensorC.data[1]).to.closeTo(15.0, 0.1);
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.modelrun with tag positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, tensorA, resultA, tensorB, resultB, modelBlob, model, resultModelSet, resultModelRun, tensorC, modelInfo, resultModelResetStat;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
tensorA = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [2, 3]);
return [4 /*yield*/, aiclient.tensorset('tensorA', tensorA)];
case 1:
resultA = _a.sent();
chai_1.expect(resultA).to.equal('OK');
tensorB = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [3, 5]);
return [4 /*yield*/, aiclient.tensorset('tensorB', tensorB)];
case 2:
resultB = _a.sent();
chai_1.expect(resultB).to.equal('OK');
modelBlob = fs.readFileSync('./tests/test_data/graph.pb');
model = new model_1.Model(backend_1.Backend.TF, 'CPU', ['a', 'b'], ['c'], modelBlob);
model.tag = 'test_tag';
return [4 /*yield*/, aiclient.modelset('mymodel-wtag', model)];
case 3:
resultModelSet = _a.sent();
chai_1.expect(resultModelSet).to.equal('OK');
return [4 /*yield*/, aiclient.modelrun('mymodel-wtag', ['tensorA', 'tensorB'], ['tensorC'])];
case 4:
resultModelRun = _a.sent();
chai_1.expect(resultModelRun).to.equal('OK');
return [4 /*yield*/, aiclient.tensorget('tensorC')];
case 5:
tensorC = _a.sent();
chai_1.expect(tensorC.data[0]).to.closeTo(6.0, 0.1);
chai_1.expect(tensorC.data[1]).to.closeTo(15.0, 0.1);
return [4 /*yield*/, aiclient.info('mymodel-wtag')];
case 6:
modelInfo = _a.sent();
chai_1.expect(modelInfo.key).to.equal('mymodel-wtag');
chai_1.expect(modelInfo.tag).to.equal('test_tag');
chai_1.expect(modelInfo.calls).to.equal(1);
return [4 /*yield*/, aiclient.infoResetStat('mymodel-wtag')];
case 7:
resultModelResetStat = _a.sent();
chai_1.expect(resultModelResetStat).to.equal('OK');
return [4 /*yield*/, aiclient.info('mymodel-wtag')];
case 8:
modelInfo = _a.sent();
chai_1.expect(modelInfo.calls).to.equal(0);
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.modeldel positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, modelBlob, model, resultModelSet, resultModelDel;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
modelBlob = fs.readFileSync('./tests/test_data/graph.pb');
model = new model_1.Model(backend_1.Backend.TF, 'CPU', ['a', 'b'], ['c'], modelBlob);
model.tag = 'test_tag';
return [4 /*yield*/, aiclient.modelset('mymodel-wtag', model)];
case 1:
resultModelSet = _a.sent();
chai_1.expect(resultModelSet).to.equal('OK');
return [4 /*yield*/, aiclient.modeldel('mymodel-wtag')];
case 2:
resultModelDel = _a.sent();
chai_1.expect(resultModelDel).to.equal('OK');
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.modelget positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, modelBlob, inputs, outputs, model, resultModelSet, modelOut, index, index;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
modelBlob = fs.readFileSync('./tests/test_data/graph.pb');
inputs = ['a', 'b'];
outputs = ['c'];
model = new model_1.Model(backend_1.Backend.TF, 'CPU', inputs, outputs, modelBlob);
model.tag = 'test_tag';
return [4 /*yield*/, aiclient.modelset('mymodel', model)];
case 1:
resultModelSet = _a.sent();
chai_1.expect(resultModelSet).to.equal('OK');
return [4 /*yield*/, aiclient.modelget('mymodel')];
case 2:
modelOut = _a.sent();
chai_1.expect(modelOut.blob.toString()).to.equal(modelBlob.toString());
for (index = 0; index < modelOut.outputs.length; index++) {
chai_1.expect(modelOut.outputs[index]).to.equal(outputs[index]);
chai_1.expect(modelOut.outputs[index]).to.equal(model.outputs[index]);
}
for (index = 0; index < modelOut.inputs.length; index++) {
chai_1.expect(modelOut.inputs[index]).to.equal(inputs[index]);
chai_1.expect(modelOut.inputs[index]).to.equal(model.inputs[index]);
}
chai_1.expect(modelOut.batchsize).to.equal(model.batchsize);
chai_1.expect(modelOut.minbatchsize).to.equal(model.minbatchsize);
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.modelget batching positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, modelBlob, inputs, outputs, model, resultModelSet, modelOut, resultModelSet2, modelOut2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
modelBlob = fs.readFileSync('./tests/test_data/graph.pb');
inputs = ['a', 'b'];
outputs = ['c'];
model = new model_1.Model(backend_1.Backend.TF, 'CPU', inputs, outputs, modelBlob);
model.tag = 'test_tag';
model.batchsize = 100;
model.minbatchsize = 5;
return [4 /*yield*/, aiclient.modelset('mymodel-batching', model)];
case 1:
resultModelSet = _a.sent();
chai_1.expect(resultModelSet).to.equal('OK');
return [4 /*yield*/, aiclient.modelget('mymodel-batching')];
case 2:
modelOut = _a.sent();
return [4 /*yield*/, aiclient.modelset('mymodel-batching-loop', modelOut)];
case 3:
resultModelSet2 = _a.sent();
chai_1.expect(resultModelSet2).to.equal('OK');
return [4 /*yield*/, aiclient.modelget('mymodel-batching-loop')];
case 4:
modelOut2 = _a.sent();
chai_1.expect(modelOut.batchsize).to.equal(model.batchsize);
chai_1.expect(modelOut.minbatchsize).to.equal(model.minbatchsize);
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.modelget batching via constructor positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, modelBlob, inputs, outputs, model, resultModelSet, modelOut, resultModelSet2, modelOut2, model2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
modelBlob = fs.readFileSync('./tests/test_data/graph.pb');
inputs = ['a', 'b'];
outputs = ['c'];
model = new model_1.Model(backend_1.Backend.TF, 'CPU', inputs, outputs, modelBlob, 100, 5);
model.tag = 'test_tag';
return [4 /*yield*/, aiclient.modelset('mymodel-batching-t2', model)];
case 1:
resultModelSet = _a.sent();
chai_1.expect(resultModelSet).to.equal('OK');
return [4 /*yield*/, aiclient.modelget('mymodel-batching-t2')];
case 2:
modelOut = _a.sent();
return [4 /*yield*/, aiclient.modelset('mymodel-batching-loop-t2', modelOut)];
case 3:
resultModelSet2 = _a.sent();
chai_1.expect(resultModelSet2).to.equal('OK');
return [4 /*yield*/, aiclient.modelget('mymodel-batching-loop')];
case 4:
modelOut2 = _a.sent();
chai_1.expect(modelOut.batchsize).to.equal(model.batchsize);
chai_1.expect(modelOut.minbatchsize).to.equal(model.minbatchsize);
model2 = new model_1.Model(backend_1.Backend.TF, 'CPU', inputs, outputs, modelBlob, 1000);
chai_1.expect(model2.batchsize).to.equal(1000);
chai_1.expect(model2.minbatchsize).to.equal(0);
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.modelget negative testing on response parsing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var mockedReply, result, e_7, mockedReply, result, e_8, mockedReply, result, e_9, mockedReply, result, e_10;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
mockedReply = [];
return [4 /*yield*/, model_1.Model.NewModelFromModelGetReply(mockedReply)];
case 1:
result = _a.sent();
return [3 /*break*/, 3];
case 2:
e_7 = _a.sent();
chai_1.expect(e_7.toString()).to.equal('Error: AI.MODELGET reply did not had the full elements to build the Model. Missing backend,device,blob.');
return [3 /*break*/, 3];
case 3:
_a.trys.push([3, 5, , 6]);
mockedReply = ['backend', 'TF', 'device', 'CPU'];
return [4 /*yield*/, model_1.Model.NewModelFromModelGetReply(mockedReply)];
case 4:
result = _a.sent();
return [3 /*break*/, 6];
case 5:
e_8 = _a.sent();
chai_1.expect(e_8.toString()).to.equal('Error: AI.MODELGET reply did not had the full elements to build the Model. Missing blob.');
return [3 /*break*/, 6];
case 6:
_a.trys.push([6, 8, , 9]);
mockedReply = ['blob', [], 'device', 'CPU'];
return [4 /*yield*/, model_1.Model.NewModelFromModelGetReply(mockedReply)];
case 7:
result = _a.sent();
return [3 /*break*/, 9];
case 8:
e_9 = _a.sent();
chai_1.expect(e_9.toString()).to.equal('Error: AI.MODELGET reply did not had the full elements to build the Model. Missing backend.');
return [3 /*break*/, 9];
case 9:
_a.trys.push([9, 11, , 12]);
mockedReply = ['blob', [], 'backend', 'TF'];
return [4 /*yield*/, model_1.Model.NewModelFromModelGetReply(mockedReply)];
case 10:
result = _a.sent();
return [3 /*break*/, 12];
case 11:
e_10 = _a.sent();
chai_1.expect(e_10.toString()).to.equal('Error: AI.MODELGET reply did not had the full elements to build the Model. Missing device.');
return [3 /*break*/, 12];
case 12: return [2 /*return*/];
}
});
}); }));
it('ai.scriptrun with tag positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, scriptFileStr, scriptStr, tensorA, resultA, tensorB, resultB, script, script2, resultScriptSet, resultScriptSetWithTag, resultScriptRun, resultScriptRunWithTag, tensorC, tensorD, scriptInfo, scriptInfoTag, resultScriptResetStat;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
scriptFileStr = fs.readFileSync('./tests/test_data/script.txt').toString();
scriptStr = 'def bar(a, b):\n return a + b\n';
tensorA = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [2, 3]);
return [4 /*yield*/, aiclient.tensorset('tensorA', tensorA)];
case 1:
resultA = _a.sent();
chai_1.expect(resultA).to.equal('OK');
tensorB = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [3, 5]);
return [4 /*yield*/, aiclient.tensorset('tensorB', tensorB)];
case 2:
resultB = _a.sent();
chai_1.expect(resultB).to.equal('OK');
script = new script_1.Script('CPU', scriptFileStr);
script2 = new script_1.Script('CPU', scriptStr);
script2.tag = 'test_tag';
return [4 /*yield*/, aiclient.scriptset('myscript', script)];
case 3:
resultScriptSet = _a.sent();
chai_1.expect(resultScriptSet).to.equal('OK');
return [4 /*yield*/, aiclient.scriptset('myscript-wtag', script2)];
case 4:
resultScriptSetWithTag = _a.sent();
chai_1.expect(resultScriptSetWithTag).to.equal('OK');
return [4 /*yield*/, aiclient.scriptrun('myscript', 'bar', ['tensorA', 'tensorB'], ['tensorC'])];
case 5:
resultScriptRun = _a.sent();
return [4 /*yield*/, aiclient.scriptrun('myscript-wtag', 'bar', ['tensorA', 'tensorB'], ['tensorD'])];
case 6:
resultScriptRunWithTag = _a.sent();
chai_1.expect(resultScriptRun).to.equal('OK');
chai_1.expect(resultScriptRunWithTag).to.equal('OK');
return [4 /*yield*/, aiclient.tensorget('tensorC')];
case 7:
tensorC = _a.sent();
chai_1.expect(tensorC.data[0]).to.closeTo(5.0, 0.1);
chai_1.expect(tensorC.data[1]).to.closeTo(8.0, 0.1);
return [4 /*yield*/, aiclient.tensorget('tensorD')];
case 8:
tensorD = _a.sent();
chai_1.expect(tensorD.data[0]).to.closeTo(5.0, 0.1);
chai_1.expect(tensorD.data[1]).to.closeTo(8.0, 0.1);
return [4 /*yield*/, aiclient.info('myscript')];
case 9:
scriptInfo = _a.sent();
chai_1.expect(scriptInfo.key).to.equal('myscript');
chai_1.expect(scriptInfo.calls).to.equal(1);
return [4 /*yield*/, aiclient.info('myscript-wtag')];
case 10:
scriptInfoTag = _a.sent();
chai_1.expect(scriptInfoTag.key).to.equal('myscript-wtag');
chai_1.expect(scriptInfoTag.tag).to.equal('test_tag');
chai_1.expect(scriptInfoTag.calls).to.equal(1);
return [4 /*yield*/, aiclient.infoResetStat('myscript-wtag')];
case 11:
resultScriptResetStat = _a.sent();
chai_1.expect(resultScriptResetStat).to.equal('OK');
return [4 /*yield*/, aiclient.info('myscript-wtag')];
case 12:
scriptInfoTag = _a.sent();
chai_1.expect(scriptInfoTag.calls).to.equal(0);
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.scriptdel positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, scriptStr, script, resultScriptSet, resultScriptDel;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
scriptStr = 'def bar(a, b):\n return a + b\n';
script = new script_1.Script('CPU', scriptStr);
return [4 /*yield*/, aiclient.scriptset('myscript', script)];
case 1:
resultScriptSet = _a.sent();
chai_1.expect(resultScriptSet).to.equal('OK');
return [4 /*yield*/, aiclient.scriptdel('myscript')];
case 2:
resultScriptDel = _a.sent();
chai_1.expect(resultScriptDel).to.equal('OK');
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.scriptget positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, scriptStr, script, resultScriptSet, scriptOut, scriptInfo;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
scriptStr = 'def bar(a, b):\n return a + b\n';
script = new script_1.Script('CPU', scriptStr);
return [4 /*yield*/, aiclient.scriptset('myscript', script)];
case 1:
resultScriptSet = _a.sent();
chai_1.expect(resultScriptSet).to.equal('OK');
return [4 /*yield*/, aiclient.scriptget('myscript')];
case 2:
scriptOut = _a.sent();
chai_1.expect(scriptOut.script).to.equal(scriptStr);
return [4 /*yield*/, aiclient.info('myscript')];
case 3:
scriptInfo = _a.sent();
chai_1.expect(scriptInfo.key).to.equal('myscript');
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.scriptget negative testing on response parsing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var mockedReply, result, e_11, mockedReply, result, e_12, mockedReply, result, e_13;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
mockedReply = [];
return [4 /*yield*/, script_1.Script.NewScriptFromScriptGetReply(mockedReply)];
case 1:
result = _a.sent();
return [3 /*break*/, 3];
case 2:
e_11 = _a.sent();
chai_1.expect(e_11.toString()).to.equal('Error: AI.SCRIPTGET reply did not had the full elements to build the Script. Missing device,source.');
return [3 /*break*/, 3];
case 3:
_a.trys.push([3, 5, , 6]);
mockedReply = ['device', 'CPU'];
return [4 /*yield*/, script_1.Script.NewScriptFromScriptGetReply(mockedReply)];
case 4:
result = _a.sent();
return [3 /*break*/, 6];
case 5:
e_12 = _a.sent();
chai_1.expect(e_12.toString()).to.equal('Error: AI.SCRIPTGET reply did not had the full elements to build the Script. Missing source.');
return [3 /*break*/, 6];
case 6:
_a.trys.push([6, 8, , 9]);
mockedReply = ['source', ''];
return [4 /*yield*/, script_1.Script.NewScriptFromScriptGetReply(mockedReply)];
case 7:
result = _a.sent();
return [3 /*break*/, 9];
case 8:
e_13 = _a.sent();
chai_1.expect(e_13.toString()).to.equal('Error: AI.SCRIPTGET reply did not had the full elements to build the Script. Missing device.');
return [3 /*break*/, 9];
case 9: return [2 /*return*/];
}
});
}); }));
it('ai.info negative testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, result, e_14;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, aiclient.info('dontexist')];
case 2:
result = _a.sent();
return [3 /*break*/, 4];
case 3:
e_14 = _a.sent();
chai_1.expect(e_14.toString()).to.equal('ReplyError: ERR cannot find run info for key');
return [3 /*break*/, 4];
case 4:
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.info negative testing on response parsing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var mockedReply, result, e_15, mockedReply, result, e_16, mockedReply, result, e_17, mockedReply, result, e_18, mockedReply, result, e_19, positiveMockedReply, stats;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
mockedReply = [];
return [4 /*yield*/, src_1.Stats.NewStatsFromInfoReply(mockedReply)];
case 1:
result = _a.sent();
return [3 /*break*/, 3];
case 2:
e_15 = _a.sent();
chai_1.expect(e_15.toString()).to.equal('Error: AI.INFO reply did not had the full elements to build the Stats. Missing key,type,backend,device.');
return [3 /*break*/, 3];
case 3:
_a.trys.push([3, 5, , 6]);
mockedReply = ['key', 'a', 'type', 'model', 'backend', 'TF'];
return [4 /*yield*/, src_1.Stats.NewStatsFromInfoReply(mockedReply)];
case 4:
result = _a.sent();
return [3 /*break*/, 6];
case 5:
e_16 = _a.sent();
chai_1.expect(e_16.toString()).to.equal('Error: AI.INFO reply did not had the full elements to build the Stats. Missing device.');
return [3 /*break*/, 6];
case 6:
_a.trys.push([6, 8, , 9]);
mockedReply = ['key', 'a', 'type', 'model', 'device', 'CPU'];
return [4 /*yield*/, src_1.Stats.NewStatsFromInfoReply(mockedReply)];
case 7:
result = _a.sent();
return [3 /*break*/, 9];
case 8:
e_17 = _a.sent();
chai_1.expect(e_17.toString()).to.equal('Error: AI.INFO reply did not had the full elements to build the Stats. Missing backend.');
return [3 /*break*/, 9];
case 9:
_a.trys.push([9, 11, , 12]);
mockedReply = ['key', 'a', 'backend', 'TF', 'device', 'CPU'];
return [4 /*yield*/, src_1.Stats.NewStatsFromInfoReply(mockedReply)];
case 10:
result = _a.sent();
return [3 /*break*/, 12];
case 11:
e_18 = _a.sent();
chai_1.expect(e_18.toString()).to.equal('Error: AI.INFO reply did not had the full elements to build the Stats. Missing type.');
return [3 /*break*/, 12];
case 12:
_a.trys.push([12, 14, , 15]);
mockedReply = ['type', 'script', 'backend', 'TF', 'device', 'CPU'];
return [4 /*yield*/, src_1.Stats.NewStatsFromInfoReply(mockedReply)];
case 13:
result = _a.sent();
return [3 /*break*/, 15];
case 14:
e_19 = _a.sent();
chai_1.expect(e_19.toString()).to.equal('Error: AI.INFO reply did not had the full elements to build the Stats. Missing key.');
return [3 /*break*/, 15];
case 15:
positiveMockedReply = ['key', 'key1', 'type', 'script', 'backend', 'TF', 'device', 'CPU'];
return [4 /*yield*/, src_1.Stats.NewStatsFromInfoReply(positiveMockedReply)];
case 16:
stats = _a.sent();
chai_1.expect(stats.key).to.equal('key1');
chai_1.expect(stats.type).to.equal('script');
chai_1.expect(stats.backend).to.equal(backend_1.Backend.TF);
chai_1.expect(stats.device).to.equal('CPU');
chai_1.expect(stats.tag).to.equal(undefined);
chai_1.expect(stats.calls).to.equal(0);
return [2 /*return*/];
}
});
}); }));
it('ai.scriptget negative testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, result, e_20;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, aiclient.scriptget('dontexist')];
case 2:
result = _a.sent();
return [3 /*break*/, 4];
case 3:
e_20 = _a.sent();
chai_1.expect(e_20.toString()).to.equal('ReplyError: ERR script key is empty');
return [3 /*break*/, 4];
case 4:
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.modelget negative testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, result, e_21;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, aiclient.modelget('dontexist')];
case 2:
result = _a.sent();
return [3 /*break*/, 4];
case 3:
e_21 = _a.sent();
chai_1.expect(e_21.toString()).to.equal('ReplyError: ERR model key is empty');
return [3 /*break*/, 4];
case 4:
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.dagrun simple tensorset modelrun tensorget positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, modelBlob, model, resultModelSet, dag, tensorA, tensorB, resultDagRun, tensorC;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
nativeClient = redis_1.createClient();
aiclient = new client_1.Client(nativeClient);
modelBlob = fs.readFileSync('./tests/test_data/graph.pb');
model = new model_1.Model(backend_1.Backend.TF, 'CPU', ['a', 'b'], ['c'], modelBlob);
model.tag = 'test_tag';
return [4 /*yield*/, aiclient.modelset('mymodel-dag', model)];
case 1:
resultModelSet = _a.sent();
chai_1.expect(resultModelSet).to.equal('OK');
dag = new src_1.Dag();
tensorA = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [2, 3]);
dag.tensorset('tensorA', tensorA);
tensorB = new tensor_1.Tensor(dtype_1.Dtype.float32, [1, 2], [3, 5]);
dag.tensorset('tensorB', tensorB);
dag.modelrun('mymodel-dag', ['tensorA', 'tensorB'], ['tensorC']);
dag.tensorget('tensorC');
return [4 /*yield*/, aiclient.dagrun(null, null, dag)];
case 2:
resultDagRun = _a.sent();
chai_1.expect(resultDagRun.length).to.equal(4);
chai_1.expect(resultDagRun[0]).to.equal('OK');
chai_1.expect(resultDagRun[1]).to.equal('OK');
chai_1.expect(resultDagRun[2]).to.equal('OK');
tensorC = resultDagRun[3];
chai_1.expect(tensorC.data[0]).to.closeTo(6.0, 0.1);
chai_1.expect(tensorC.data[1]).to.closeTo(15.0, 0.1);
aiclient.end(true);
return [2 /*return*/];
}
});
}); }));
it('ai.dagrun chaining positive testing', mochaAsync(function () { return __awaiter(void 0, void 0, void 0, function () {
var nativeClient, aiclient, modelBlob, model, resultModelSet, dag, te