weaviate-client
Version:
JS/TS client for Weaviate
1,129 lines • 60.7 kB
JavaScript
"use strict";
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 _a, _b, _c;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Serialize = exports.MetadataGuards = exports.DataGuards = void 0;
const uuid_1 = require("uuid");
const base_search_js_1 = require("../../proto/v1/base_search.js");
const batch_js_1 = require("../../proto/v1/batch.js");
const generative_js_1 = require("../../proto/v1/generative.js");
const search_get_js_1 = require("../../proto/v1/search_get.js");
const errors_js_1 = require("../../errors.js");
const index_js_1 = require("../../index.js");
const aggregate_js_1 = require("../../proto/v1/aggregate.js");
const base_js_1 = require("../../proto/v1/base.js");
const yield_js_1 = require("../../utils/yield.js");
const classes_js_1 = require("../filters/classes.js");
const index_js_2 = require("../filters/index.js");
const utils_js_1 = require("../query/utils.js");
const classes_js_2 = require("../references/classes.js");
const utils_js_2 = require("../references/utils.js");
class FilterGuards {
}
FilterGuards.isFilters = (argument) => {
return argument instanceof index_js_2.Filters;
};
FilterGuards.isText = (argument) => {
return typeof argument === 'string';
};
FilterGuards.isTextArray = (argument) => {
return (argument instanceof Array &&
argument.every((arg) => typeof arg === 'string'));
};
FilterGuards.isInt = (argument) => {
return typeof argument === 'number' && Number.isInteger(argument);
};
FilterGuards.isIntArray = (argument) => {
return (argument instanceof Array &&
argument.every((arg) => typeof arg === 'number' && Number.isInteger(arg)));
};
FilterGuards.isFloat = (argument) => {
return typeof argument === 'number' && !Number.isInteger(argument);
};
FilterGuards.isFloatArray = (argument) => {
return (argument instanceof Array &&
argument.every((arg) => typeof arg === 'number' && !Number.isInteger(arg)));
};
FilterGuards.isBoolean = (argument) => {
return typeof argument === 'boolean';
};
FilterGuards.isBooleanArray = (argument) => {
return (argument instanceof Array &&
argument.every((arg) => typeof arg === 'boolean'));
};
FilterGuards.isDate = (argument) => {
return argument instanceof Date;
};
FilterGuards.isDateArray = (argument) => {
return (argument instanceof Array && argument.every((arg) => arg instanceof Date));
};
FilterGuards.isGeoRange = (argument) => {
if (argument === undefined) {
return false;
}
const arg = argument;
return arg.latitude !== undefined && arg.longitude !== undefined && arg.distance !== undefined;
};
class DataGuards {
}
exports.DataGuards = DataGuards;
DataGuards.isText = (argument) => {
return typeof argument === 'string';
};
DataGuards.isTextArray = (argument) => {
return (argument instanceof Array &&
argument.length > 0 &&
argument.every(DataGuards.isText));
};
DataGuards.isInt = (argument) => {
return (typeof argument === 'number' &&
Number.isInteger(argument) &&
!Number.isNaN(argument) &&
Number.isFinite(argument));
};
DataGuards.isIntArray = (argument) => {
return (argument instanceof Array &&
argument.length > 0 &&
argument.every(DataGuards.isInt));
};
DataGuards.isFloat = (argument) => {
return (typeof argument === 'number' &&
!Number.isInteger(argument) &&
!Number.isNaN(argument) &&
Number.isFinite(argument));
};
DataGuards.isFloatArray = (argument) => {
return (argument instanceof Array &&
argument.length > 0 &&
argument.every(DataGuards.isFloat));
};
DataGuards.isBoolean = (argument) => {
return typeof argument === 'boolean';
};
DataGuards.isBooleanArray = (argument) => {
return (argument instanceof Array &&
argument.length > 0 &&
argument.every(DataGuards.isBoolean));
};
DataGuards.isDate = (argument) => {
return argument instanceof Date;
};
DataGuards.isDateArray = (argument) => {
return (argument instanceof Array &&
argument.length > 0 &&
argument.every(DataGuards.isDate));
};
DataGuards.isGeoCoordinate = (argument) => {
return (argument instanceof Object &&
argument.latitude !== undefined &&
argument.longitude !== undefined &&
Object.keys(argument).length === 2);
};
DataGuards.isPhoneNumber = (argument) => {
return (argument instanceof Object &&
argument.number !== undefined &&
(Object.keys(argument).length === 1 ||
(Object.keys(argument).length === 2 && argument.defaultCountry !== undefined)));
};
DataGuards.isNested = (argument) => {
return (argument instanceof Object &&
!(argument instanceof Array) &&
!DataGuards.isDate(argument) &&
!DataGuards.isGeoCoordinate(argument) &&
!DataGuards.isPhoneNumber(argument));
};
DataGuards.isNestedArray = (argument) => {
return (argument instanceof Array &&
argument.length > 0 &&
argument.every(DataGuards.isNested));
};
DataGuards.isEmptyArray = (argument) => {
return argument instanceof Array && argument.length === 0;
};
DataGuards.isDataObject = (obj) => {
return (obj.id !== undefined ||
obj.properties !== undefined ||
obj.references !== undefined ||
obj.vectors !== undefined);
};
class MetadataGuards {
}
exports.MetadataGuards = MetadataGuards;
MetadataGuards.isKeys = (argument) => {
return argument instanceof Array && argument.length > 0;
};
MetadataGuards.isAll = (argument) => {
return argument === 'all';
};
MetadataGuards.isUndefined = (argument) => {
return argument === undefined;
};
class Aggregate {
}
_a = Aggregate;
Aggregate.aggregations = (returnMetrics) => {
if (returnMetrics === undefined) {
return [];
}
if (!Array.isArray(returnMetrics)) {
returnMetrics = [returnMetrics];
}
return returnMetrics.map((metric) => aggregate_js_1.AggregateRequest_Aggregation.fromPartial({
property: metric.propertyName,
boolean: metric.kind === 'boolean' ? aggregate_js_1.AggregateRequest_Aggregation_Boolean.fromPartial(metric) : undefined,
date: metric.kind === 'date' ? aggregate_js_1.AggregateRequest_Aggregation_DateMessage.fromPartial(metric) : undefined,
int: metric.kind === 'integer' ? aggregate_js_1.AggregateRequest_Aggregation_Integer.fromPartial(metric) : undefined,
number: metric.kind === 'number' ? aggregate_js_1.AggregateRequest_Aggregation_Number.fromPartial(metric) : undefined,
text: metric.kind === 'text'
? aggregate_js_1.AggregateRequest_Aggregation_Text.fromPartial({
count: metric.count,
topOccurencesLimit: metric.minOccurrences,
topOccurences: metric.topOccurrences != undefined,
})
: undefined,
}));
};
Aggregate.common = (opts) => {
return {
filters: (opts === null || opts === void 0 ? void 0 : opts.filters) ? Serialize.filtersGRPC(opts.filters) : undefined,
aggregations: _a.aggregations(opts === null || opts === void 0 ? void 0 : opts.returnMetrics),
};
};
Aggregate.groupBy = (groupBy) => {
return aggregate_js_1.AggregateRequest_GroupBy.fromPartial({
property: groupBy === null || groupBy === void 0 ? void 0 : groupBy.property,
});
};
Aggregate.hybrid = (query, opts) => __awaiter(void 0, void 0, void 0, function* () {
return Object.assign(Object.assign({}, _a.common(opts)), { objectLimit: opts === null || opts === void 0 ? void 0 : opts.objectLimit, hybrid: yield Serialize.hybridSearch(Object.assign({ query: query, supportsVectors: true }, opts)) });
});
Aggregate.nearImage = (image, opts) => {
return Object.assign(Object.assign({}, _a.common(opts)), { objectLimit: opts === null || opts === void 0 ? void 0 : opts.objectLimit, nearImage: Serialize.nearImageSearch(Object.assign({ image }, opts)) });
};
Aggregate.nearObject = (id, opts) => {
return Object.assign(Object.assign({}, _a.common(opts)), { objectLimit: opts === null || opts === void 0 ? void 0 : opts.objectLimit, nearObject: Serialize.nearObjectSearch(Object.assign({ id }, opts)) });
};
Aggregate.nearText = (query, opts) => {
return Object.assign(Object.assign({}, _a.common(opts)), { objectLimit: opts === null || opts === void 0 ? void 0 : opts.objectLimit, nearText: Serialize.nearTextSearch(Object.assign({ query }, opts)) });
};
Aggregate.nearVector = (vector, opts) => __awaiter(void 0, void 0, void 0, function* () {
return Object.assign(Object.assign({}, _a.common(opts)), { objectLimit: opts === null || opts === void 0 ? void 0 : opts.objectLimit, nearVector: yield Serialize.nearVectorSearch(Object.assign({ vector, supportsVectors: true }, opts)) });
});
Aggregate.overAll = (opts) => _a.common(opts);
class Search {
}
_b = Search;
Search.queryProperties = (properties, references) => {
const nonRefProperties = properties === null || properties === void 0 ? void 0 : properties.filter((property) => typeof property === 'string');
const refProperties = references;
const objectProperties = properties === null || properties === void 0 ? void 0 : properties.filter((property) => typeof property === 'object');
const resolveObjectProperty = (property) => {
const objProps = property.properties.filter((property) => typeof property !== 'string'); // cannot get types to work currently :(
return {
propName: property.name,
primitiveProperties: property.properties.filter((property) => typeof property === 'string'),
objectProperties: objProps.map(resolveObjectProperty),
};
};
return {
nonRefProperties: nonRefProperties === undefined ? [] : nonRefProperties,
returnAllNonrefProperties: nonRefProperties === undefined,
refProperties: refProperties
? refProperties.map((property) => {
return {
referenceProperty: property.linkOn,
properties: _b.queryProperties(property.returnProperties),
metadata: _b.metadata(property.includeVector, property.returnMetadata),
targetCollection: property.targetCollection ? property.targetCollection : '',
};
})
: [],
objectProperties: objectProperties
? objectProperties.map((property) => {
const objProps = property.properties.filter((property) => typeof property !== 'string'); // cannot get types to work currently :(
return {
propName: property.name,
primitiveProperties: property.properties.filter((property) => typeof property === 'string'),
objectProperties: objProps.map(resolveObjectProperty),
};
})
: [],
};
};
Search.metadata = (includeVector, metadata) => {
const out = {
uuid: true,
vector: typeof includeVector === 'boolean' ? includeVector : false,
vectors: Array.isArray(includeVector) ? includeVector : [],
};
if (MetadataGuards.isAll(metadata)) {
return Object.assign(Object.assign({}, out), { creationTimeUnix: true, lastUpdateTimeUnix: true, distance: true, certainty: true, score: true, explainScore: true, isConsistent: true });
}
metadata === null || metadata === void 0 ? void 0 : metadata.forEach((key) => {
let weaviateKey;
if (key === 'creationTime') {
weaviateKey = 'creationTimeUnix';
}
else if (key === 'updateTime') {
weaviateKey = 'lastUpdateTimeUnix';
}
else {
weaviateKey = key;
}
out[weaviateKey] = true;
});
return search_get_js_1.MetadataRequest.fromPartial(out);
};
Search.sortBy = (sort) => {
return sort.map((sort) => {
return {
ascending: !!sort.ascending,
path: [sort.property],
};
});
};
Search.rerank = (rerank) => {
return search_get_js_1.Rerank.fromPartial({
property: rerank.property,
query: rerank.query,
});
};
Search.groupBy = (groupBy) => {
return search_get_js_1.GroupBy.fromPartial({
path: (groupBy === null || groupBy === void 0 ? void 0 : groupBy.property) ? [groupBy.property] : undefined,
numberOfGroups: groupBy === null || groupBy === void 0 ? void 0 : groupBy.numberOfGroups,
objectsPerGroup: groupBy === null || groupBy === void 0 ? void 0 : groupBy.objectsPerGroup,
});
};
Search.isGroupBy = (args) => {
if (args === undefined)
return false;
return args.groupBy !== undefined;
};
Search.common = (args) => {
const out = {
autocut: args === null || args === void 0 ? void 0 : args.autoLimit,
limit: args === null || args === void 0 ? void 0 : args.limit,
offset: args === null || args === void 0 ? void 0 : args.offset,
filters: (args === null || args === void 0 ? void 0 : args.filters) ? Serialize.filtersGRPC(args.filters) : undefined,
properties: (args === null || args === void 0 ? void 0 : args.returnProperties) || (args === null || args === void 0 ? void 0 : args.returnReferences)
? _b.queryProperties(args.returnProperties, args.returnReferences)
: undefined,
metadata: _b.metadata(args === null || args === void 0 ? void 0 : args.includeVector, args === null || args === void 0 ? void 0 : args.returnMetadata),
};
if (args === null || args === void 0 ? void 0 : args.rerank) {
out.rerank = _b.rerank(args.rerank);
}
return out;
};
Search.bm25 = (query, opts) => {
return Object.assign(Object.assign({}, _b.common(opts)), { bm25Search: Serialize.bm25Search(Object.assign({ query }, opts)), groupBy: _b.isGroupBy(opts) ? _b.groupBy(opts.groupBy) : undefined });
};
Search.fetchObjects = (args) => {
return Object.assign(Object.assign({}, _b.common(args)), { after: args === null || args === void 0 ? void 0 : args.after, sortBy: (args === null || args === void 0 ? void 0 : args.sort) ? _b.sortBy(args.sort.sorts) : undefined });
};
Search.fetchObjectById = (args) => {
return _b.common({
filters: new classes_js_1.FilterId().equal(args.id),
includeVector: args.includeVector,
returnMetadata: ['creationTime', 'updateTime', 'isConsistent'],
returnProperties: args.returnProperties,
returnReferences: args.returnReferences,
});
};
Search.hybrid = (args, opts) => __awaiter(void 0, void 0, void 0, function* () {
return Object.assign(Object.assign({}, _b.common(opts)), { hybridSearch: yield Serialize.hybridSearch(Object.assign(Object.assign({}, args), opts)), groupBy: _b.isGroupBy(opts)
? _b.groupBy(opts.groupBy)
: undefined });
});
Search.nearAudio = (args, opts) => {
return Object.assign(Object.assign({}, _b.common(opts)), { nearAudio: Serialize.nearAudioSearch(Object.assign(Object.assign({}, args), opts)), groupBy: _b.isGroupBy(opts) ? _b.groupBy(opts.groupBy) : undefined });
};
Search.nearDepth = (args, opts) => {
return Object.assign(Object.assign({}, _b.common(opts)), { nearDepth: Serialize.nearDepthSearch(Object.assign(Object.assign({}, args), opts)), groupBy: _b.isGroupBy(opts) ? _b.groupBy(opts.groupBy) : undefined });
};
Search.nearImage = (args, opts) => {
return Object.assign(Object.assign({}, _b.common(opts)), { nearImage: Serialize.nearImageSearch(Object.assign(Object.assign({}, args), opts)), groupBy: _b.isGroupBy(opts) ? _b.groupBy(opts.groupBy) : undefined });
};
Search.nearIMU = (args, opts) => {
return Object.assign(Object.assign({}, _b.common(opts)), { nearIMU: Serialize.nearIMUSearch(Object.assign(Object.assign({}, args), opts)), groupBy: _b.isGroupBy(opts) ? _b.groupBy(opts.groupBy) : undefined });
};
Search.nearObject = (args, opts) => {
return Object.assign(Object.assign({}, _b.common(opts)), { nearObject: Serialize.nearObjectSearch(Object.assign(Object.assign({}, args), opts)), groupBy: _b.isGroupBy(opts) ? _b.groupBy(opts.groupBy) : undefined });
};
Search.nearText = (args, opts) => {
return Object.assign(Object.assign({}, _b.common(opts)), { nearText: Serialize.nearTextSearch(Object.assign(Object.assign({}, args), opts)), groupBy: _b.isGroupBy(opts) ? _b.groupBy(opts.groupBy) : undefined });
};
Search.nearThermal = (args, opts) => {
return Object.assign(Object.assign({}, _b.common(opts)), { nearThermal: Serialize.nearThermalSearch(Object.assign(Object.assign({}, args), opts)), groupBy: _b.isGroupBy(opts) ? _b.groupBy(opts.groupBy) : undefined });
};
Search.nearVector = (args, opts) => __awaiter(void 0, void 0, void 0, function* () {
return Object.assign(Object.assign({}, _b.common(opts)), { nearVector: yield Serialize.nearVectorSearch(Object.assign(Object.assign({}, args), opts)), groupBy: _b.isGroupBy(opts) ? _b.groupBy(opts.groupBy) : undefined });
});
Search.nearVideo = (args, opts) => {
return Object.assign(Object.assign({}, _b.common(opts)), { nearVideo: Serialize.nearVideoSearch(Object.assign(Object.assign({}, args), opts)), groupBy: _b.isGroupBy(opts) ? _b.groupBy(opts.groupBy) : undefined });
};
class Serialize {
static isSinglePrompt(arg) {
return typeof arg !== 'string' && arg !== undefined && arg.prompt !== undefined;
}
static isGroupedTask(arg) {
return typeof arg !== 'string' && arg !== undefined && arg.prompt !== undefined;
}
static tenants(tenants, mapper) {
const mapped = [];
const batches = Math.ceil(tenants.length / 100);
for (let i = 0; i < batches; i++) {
const batch = tenants.slice(i * 100, (i + 1) * 100);
mapped.push(batch.map(mapper));
}
return mapped;
}
static tenantCreate(tenant) {
let activityStatus;
switch (tenant.activityStatus) {
case 'ACTIVE':
activityStatus = 'HOT';
break;
case 'INACTIVE':
activityStatus = 'COLD';
break;
case 'HOT':
case 'COLD':
case undefined:
activityStatus = tenant.activityStatus;
break;
case 'FROZEN':
throw new errors_js_1.WeaviateInvalidInputError('Invalid activity status. Please provide one of the following: ACTIVE, INACTIVE, HOT, COLD.');
default:
throw new errors_js_1.WeaviateInvalidInputError('Invalid activity status. Please provide one of the following: ACTIVE, INACTIVE, HOT, COLD.');
}
return {
name: tenant.name,
activityStatus,
};
}
static tenantUpdate(tenant) {
let activityStatus;
switch (tenant.activityStatus) {
case 'ACTIVE':
activityStatus = 'HOT';
break;
case 'INACTIVE':
activityStatus = 'COLD';
break;
case 'OFFLOADED':
activityStatus = 'FROZEN';
break;
case 'HOT':
case 'COLD':
case 'FROZEN':
activityStatus = tenant.activityStatus;
break;
default:
throw new errors_js_1.WeaviateInvalidInputError('Invalid activity status. Please provide one of the following: ACTIVE, INACTIVE, HOT, COLD, OFFLOADED.');
}
return {
name: tenant.name,
activityStatus,
};
}
}
exports.Serialize = Serialize;
_c = Serialize;
Serialize.aggregate = Aggregate;
Serialize.search = Search;
Serialize.isNamedVectors = (opts) => {
return Array.isArray(opts === null || opts === void 0 ? void 0 : opts.includeVector) || (opts === null || opts === void 0 ? void 0 : opts.targetVector) !== undefined;
};
Serialize.isMultiTarget = (opts) => {
return (opts === null || opts === void 0 ? void 0 : opts.targetVector) !== undefined && !utils_js_1.TargetVectorInputGuards.isSingle(opts.targetVector);
};
Serialize.isMultiWeightPerTarget = (opts) => {
return ((opts === null || opts === void 0 ? void 0 : opts.targetVector) !== undefined &&
utils_js_1.TargetVectorInputGuards.isMultiJoin(opts.targetVector) &&
opts.targetVector.weights !== undefined &&
Object.values(opts.targetVector.weights).some(utils_js_1.ArrayInputGuards.is1DArray));
};
Serialize.isMultiVector = (vec) => {
return (vec !== undefined &&
!Array.isArray(vec) &&
Object.values(vec).some(utils_js_1.ArrayInputGuards.is1DArray || utils_js_1.ArrayInputGuards.is2DArray));
};
Serialize.isMultiVectorPerTarget = (vec) => {
return vec !== undefined && !Array.isArray(vec) && Object.values(vec).some(utils_js_1.ArrayInputGuards.is2DArray);
};
Serialize.withImages = (config, imgs, imgProps) => __awaiter(void 0, void 0, void 0, function* () {
if (imgs == undefined && imgProps == undefined) {
return config;
}
return Object.assign(Object.assign({}, config), { images: base_js_1.TextArray.fromPartial({
values: imgs ? yield Promise.all(imgs.map(index_js_1.toBase64FromMedia)) : undefined,
}), imageProperties: base_js_1.TextArray.fromPartial({ values: imgProps }) });
});
Serialize.generativeQuery = (generative, opts) => __awaiter(void 0, void 0, void 0, function* () {
const provider = generative_js_1.GenerativeProvider.fromPartial({ returnMetadata: opts === null || opts === void 0 ? void 0 : opts.metadata });
switch (generative.name) {
case 'generative-anthropic':
provider.anthropic = yield _c.withImages(generative.config || {}, opts === null || opts === void 0 ? void 0 : opts.images, opts === null || opts === void 0 ? void 0 : opts.imageProperties);
break;
case 'generative-anyscale':
provider.anyscale = generative.config || {};
break;
case 'generative-aws':
provider.aws = yield _c.withImages(generative.config || {}, opts === null || opts === void 0 ? void 0 : opts.images, opts === null || opts === void 0 ? void 0 : opts.imageProperties);
break;
case 'generative-cohere':
provider.cohere = yield _c.withImages(generative.config || {}, opts === null || opts === void 0 ? void 0 : opts.images, opts === null || opts === void 0 ? void 0 : opts.imageProperties);
break;
case 'generative-databricks':
provider.databricks = generative.config || {};
break;
case 'generative-dummy':
provider.dummy = generative.config || {};
break;
case 'generative-friendliai':
provider.friendliai = generative.config || {};
break;
case 'generative-google':
provider.google = yield _c.withImages(generative.config || {}, opts === null || opts === void 0 ? void 0 : opts.images, opts === null || opts === void 0 ? void 0 : opts.imageProperties);
break;
case 'generative-mistral':
provider.mistral = generative.config || {};
break;
case 'generative-nvidia':
provider.nvidia = generative.config || {};
break;
case 'generative-ollama':
provider.ollama = yield _c.withImages(generative.config || {}, opts === null || opts === void 0 ? void 0 : opts.images, opts === null || opts === void 0 ? void 0 : opts.imageProperties);
break;
case 'generative-openai':
provider.openai = yield _c.withImages(generative.config || {}, opts === null || opts === void 0 ? void 0 : opts.images, opts === null || opts === void 0 ? void 0 : opts.imageProperties);
break;
}
return provider;
});
Serialize.generative = (args, opts) => __awaiter(void 0, void 0, void 0, function* () {
const singlePrompt = _c.isSinglePrompt(opts === null || opts === void 0 ? void 0 : opts.singlePrompt)
? opts.singlePrompt.prompt
: opts === null || opts === void 0 ? void 0 : opts.singlePrompt;
const singlePromptDebug = _c.isSinglePrompt(opts === null || opts === void 0 ? void 0 : opts.singlePrompt)
? opts.singlePrompt.debug
: undefined;
const groupedTask = _c.isGroupedTask(opts === null || opts === void 0 ? void 0 : opts.groupedTask)
? opts.groupedTask.prompt
: opts === null || opts === void 0 ? void 0 : opts.groupedTask;
const groupedProperties = _c.isGroupedTask(opts === null || opts === void 0 ? void 0 : opts.groupedTask)
? opts.groupedTask.nonBlobProperties
: opts === null || opts === void 0 ? void 0 : opts.groupedProperties;
const singleOpts = _c.isSinglePrompt(opts === null || opts === void 0 ? void 0 : opts.singlePrompt) ? opts.singlePrompt : undefined;
const groupedOpts = _c.isGroupedTask(opts === null || opts === void 0 ? void 0 : opts.groupedTask) ? opts.groupedTask : undefined;
return args.supportsSingleGrouped
? generative_js_1.GenerativeSearch.fromPartial({
single: (opts === null || opts === void 0 ? void 0 : opts.singlePrompt)
? generative_js_1.GenerativeSearch_Single.fromPartial({
prompt: singlePrompt,
debug: singlePromptDebug,
queries: opts.config ? [yield _c.generativeQuery(opts.config, singleOpts)] : undefined,
})
: undefined,
grouped: (opts === null || opts === void 0 ? void 0 : opts.groupedTask)
? generative_js_1.GenerativeSearch_Grouped.fromPartial({
task: groupedTask,
queries: opts.config
? [yield _c.generativeQuery(opts.config, groupedOpts)]
: undefined,
properties: groupedProperties
? base_js_1.TextArray.fromPartial({ values: groupedProperties })
: undefined,
})
: undefined,
})
: generative_js_1.GenerativeSearch.fromPartial({
singleResponsePrompt: singlePrompt,
groupedResponseTask: groupedTask,
groupedProperties: groupedProperties,
});
});
Serialize.bm25QueryProperties = (properties) => {
return properties === null || properties === void 0 ? void 0 : properties.map((property) => {
if (typeof property === 'string') {
return property;
}
else {
return `${property.name}^${property.weight}`;
}
});
};
Serialize.bm25SearchOperator = (searchOperator) => {
if (searchOperator) {
return base_search_js_1.SearchOperatorOptions.fromPartial(searchOperator.operator === 'And'
? { operator: base_search_js_1.SearchOperatorOptions_Operator.OPERATOR_AND }
: {
operator: base_search_js_1.SearchOperatorOptions_Operator.OPERATOR_OR,
minimumOrTokensMatch: searchOperator.minimumMatch,
});
}
};
Serialize.bm25Search = (args) => {
return base_search_js_1.BM25.fromPartial({
query: args.query,
properties: _c.bm25QueryProperties(args.queryProperties),
searchOperator: _c.bm25SearchOperator(args.operator),
});
};
Serialize.isHybridVectorSearch = (vector) => {
return (vector !== undefined &&
!_c.isHybridNearTextSearch(vector) &&
!_c.isHybridNearVectorSearch(vector));
};
Serialize.isHybridNearTextSearch = (vector) => {
return (vector === null || vector === void 0 ? void 0 : vector.query) !== undefined;
};
Serialize.isHybridNearVectorSearch = (vector) => {
return (vector === null || vector === void 0 ? void 0 : vector.vector) !== undefined;
};
Serialize.hybridVector = (args) => __awaiter(void 0, void 0, void 0, function* () {
const vector = args.vector;
if (_c.isHybridVectorSearch(vector)) {
const { targets, targetVectors, vectorBytes, vectorPerTarget, vectorForTargets, vectors } = yield _c.vectors(Object.assign(Object.assign({}, args), { argumentName: 'vector', vector: vector }));
return vectorBytes !== undefined
? { vectorBytes, targetVectors, targets }
: {
targetVectors,
targets,
nearVector: vectorForTargets != undefined || vectorPerTarget != undefined
? base_search_js_1.NearVector.fromPartial({
vectorForTargets,
vectorPerTarget,
})
: undefined,
vectors,
};
}
else if (_c.isHybridNearTextSearch(vector)) {
const { targetVectors, targets } = _c.targetVector(args);
return {
targets,
targetVectors,
nearText: base_search_js_1.NearTextSearch.fromPartial({
query: typeof vector.query === 'string' ? [vector.query] : vector.query,
certainty: vector.certainty,
distance: vector.distance,
moveAway: vector.moveAway ? base_search_js_1.NearTextSearch_Move.fromPartial(vector.moveAway) : undefined,
moveTo: vector.moveTo ? base_search_js_1.NearTextSearch_Move.fromPartial(vector.moveTo) : undefined,
}),
};
}
else if (_c.isHybridNearVectorSearch(vector)) {
const { targetVectors, targets, vectorBytes, vectorPerTarget, vectorForTargets, vectors } = yield _c.vectors(Object.assign(Object.assign({}, args), { argumentName: 'vector', vector: vector.vector }));
return {
targetVectors,
targets,
nearVector: base_search_js_1.NearVector.fromPartial({
certainty: vector.certainty,
distance: vector.distance,
vectorBytes,
vectorPerTarget,
vectorForTargets,
vectors,
}),
};
}
else {
const { targets, targetVectors } = _c.targetVector(args);
return { targets, targetVectors };
}
});
Serialize.hybridSearch = (args) => __awaiter(void 0, void 0, void 0, function* () {
const fusionType = (fusionType) => {
switch (fusionType) {
case 'Ranked':
return base_search_js_1.Hybrid_FusionType.FUSION_TYPE_RANKED;
case 'RelativeScore':
return base_search_js_1.Hybrid_FusionType.FUSION_TYPE_RELATIVE_SCORE;
default:
return base_search_js_1.Hybrid_FusionType.FUSION_TYPE_UNSPECIFIED;
}
};
const { targets, targetVectors, vectorBytes, nearText, nearVector, vectors } = yield _c.hybridVector(args);
return base_search_js_1.Hybrid.fromPartial({
query: args.query,
alpha: args.alpha !== undefined ? args.alpha : 0.5,
properties: _c.bm25QueryProperties(args.queryProperties),
vectorBytes: vectorBytes,
vectorDistance: args.maxVectorDistance,
fusionType: fusionType(args.fusionType),
bm25SearchOperator: _c.bm25SearchOperator(args.bm25Operator),
targetVectors,
targets,
nearText,
nearVector,
vectors,
});
});
Serialize.nearAudioSearch = (args) => {
const { targets, targetVectors } = _c.targetVector(args);
return base_search_js_1.NearAudioSearch.fromPartial({
audio: args.audio,
certainty: args.certainty,
distance: args.distance,
targetVectors,
targets,
});
};
Serialize.nearDepthSearch = (args) => {
const { targets, targetVectors } = _c.targetVector(args);
return base_search_js_1.NearDepthSearch.fromPartial({
depth: args.depth,
certainty: args.certainty,
distance: args.distance,
targetVectors,
targets,
});
};
Serialize.nearImageSearch = (args) => {
const { targets, targetVectors } = _c.targetVector(args);
return base_search_js_1.NearImageSearch.fromPartial({
image: args.image,
certainty: args.certainty,
distance: args.distance,
targetVectors,
targets,
});
};
Serialize.nearIMUSearch = (args) => {
const { targets, targetVectors } = _c.targetVector(args);
return base_search_js_1.NearIMUSearch.fromPartial({
imu: args.imu,
certainty: args.certainty,
distance: args.distance,
targetVectors,
targets,
});
};
Serialize.nearObjectSearch = (args) => {
const { targets, targetVectors } = _c.targetVector(args);
return base_search_js_1.NearObject.fromPartial({
id: args.id,
certainty: args.certainty,
distance: args.distance,
targetVectors,
targets,
});
};
Serialize.nearTextSearch = (args) => {
const { targets, targetVectors } = _c.targetVector(args);
return base_search_js_1.NearTextSearch.fromPartial({
query: typeof args.query === 'string' ? [args.query] : args.query,
certainty: args.certainty,
distance: args.distance,
targets,
targetVectors,
moveAway: args.moveAway
? base_search_js_1.NearTextSearch_Move.fromPartial({
concepts: args.moveAway.concepts,
force: args.moveAway.force,
uuids: args.moveAway.objects,
})
: undefined,
moveTo: args.moveTo
? base_search_js_1.NearTextSearch_Move.fromPartial({
concepts: args.moveTo.concepts,
force: args.moveTo.force,
uuids: args.moveTo.objects,
})
: undefined,
});
};
Serialize.nearThermalSearch = (args) => {
const { targets, targetVectors } = _c.targetVector(args);
return base_search_js_1.NearThermalSearch.fromPartial({
thermal: args.thermal,
certainty: args.certainty,
distance: args.distance,
targetVectors,
targets,
});
};
Serialize.vectorToBuffer = (vector) => {
return new Float32Array(vector).buffer;
};
Serialize.vectorToBytes = (vector) => {
const uint32len = 4;
const dv = new DataView(new ArrayBuffer(vector.length * uint32len));
vector.forEach((v, i) => dv.setFloat32(i * uint32len, v, true));
return new Uint8Array(dv.buffer);
};
/**
* Convert a 2D array of numbers to a Uint8Array
*
* Defined as an async method so that control can be relinquished back to the event loop on each outer loop for large vectors
*/
Serialize.vectorsToBytes = (vectors) => __awaiter(void 0, void 0, void 0, function* () {
if (vectors.length === 0) {
return new Uint8Array();
}
if (vectors[0].length === 0) {
return new Uint8Array();
}
const uint16Len = 2;
const uint32len = 4;
const dim = vectors[0].length;
const dv = new DataView(new ArrayBuffer(uint16Len + vectors.length * dim * uint32len));
dv.setUint16(0, dim, true);
dv.setUint16(uint16Len, vectors.length, true);
yield Promise.all(vectors.map((vector, i) => (0, yield_js_1.yieldToEventLoop)().then(() => vector.forEach((v, j) => dv.setFloat32(uint16Len + i * dim * uint32len + j * uint32len, v, true)))));
return new Uint8Array(dv.buffer);
});
Serialize.nearVectorSearch = (args) => __awaiter(void 0, void 0, void 0, function* () {
return base_search_js_1.NearVector.fromPartial(Object.assign({ certainty: args.certainty, distance: args.distance }, (yield _c.vectors(Object.assign(Object.assign({}, args), { argumentName: 'nearVector' })))));
});
Serialize.targetVector = (args) => {
if ((args === null || args === void 0 ? void 0 : args.targetVector) === undefined) {
return {};
}
else if (utils_js_1.TargetVectorInputGuards.isSingle(args.targetVector)) {
return {
targets: base_search_js_1.Targets.fromPartial({
targetVectors: [args.targetVector],
}),
};
}
else if (utils_js_1.TargetVectorInputGuards.isMulti(args.targetVector)) {
return {
targets: base_search_js_1.Targets.fromPartial({
targetVectors: args.targetVector,
}),
};
}
else {
return { targets: _c.targets(args.targetVector) };
}
};
Serialize.vectors = (args) => __awaiter(void 0, void 0, void 0, function* () {
const invalidVectorError = new errors_js_1.WeaviateInvalidInputError(`${args.argumentName} argument must be populated and:
- an array of numbers (number[])
- an object with target names as keys and 1D and/or 2D arrays of numbers (number[] or number[][]) as values
received: ${args.vector} and ${args.targetVector}`);
if (args.vector === undefined) {
return _c.targetVector(args);
}
if (utils_js_1.NearVectorInputGuards.isObject(args.vector)) {
if (Object.keys(args.vector).length === 0) {
throw invalidVectorError;
}
const vectorForTargets = [];
for (const [target, vector] of Object.entries(args.vector)) {
if (!args.supportsVectors) {
if (utils_js_1.NearVectorInputGuards.isListOf2D(vector)) {
throw new errors_js_1.WeaviateUnsupportedFeatureError('Lists of multi-vectors are not supported in Weaviate <1.29.0');
}
if (utils_js_1.ArrayInputGuards.is2DArray(vector)) {
vector.forEach((v) => vectorForTargets.push({ name: target, vectorBytes: _c.vectorToBytes(v), vectors: [] }));
continue;
}
if (utils_js_1.NearVectorInputGuards.isListOf1D(vector)) {
vector.vectors.forEach((v) => vectorForTargets.push({
name: target,
vectorBytes: _c.vectorToBytes(v),
vectors: [],
}));
continue;
}
vectorForTargets.push({ name: target, vectorBytes: _c.vectorToBytes(vector), vectors: [] });
continue;
}
const vectorForTarget = {
name: target,
vectorBytes: new Uint8Array(),
vectors: [],
};
if (utils_js_1.NearVectorInputGuards.isListOf1D(vector)) {
vectorForTarget.vectors.push(base_js_1.Vectors.fromPartial({
type: base_js_1.Vectors_VectorType.VECTOR_TYPE_SINGLE_FP32,
vectorBytes: yield _c.vectorsToBytes(vector.vectors), // eslint-disable-line no-await-in-loop
}));
}
else if (utils_js_1.NearVectorInputGuards.isListOf2D(vector)) {
for (const v of vector.vectors) {
vectorForTarget.vectors.push(base_js_1.Vectors.fromPartial({
type: base_js_1.Vectors_VectorType.VECTOR_TYPE_MULTI_FP32,
vectorBytes: yield _c.vectorsToBytes(v), // eslint-disable-line no-await-in-loop
}));
}
}
else if (utils_js_1.ArrayInputGuards.is2DArray(vector)) {
vectorForTarget.vectors.push(base_js_1.Vectors.fromPartial({
type: base_js_1.Vectors_VectorType.VECTOR_TYPE_MULTI_FP32,
vectorBytes: yield _c.vectorsToBytes(vector), // eslint-disable-line no-await-in-loop
}));
}
else {
vectorForTarget.vectors.push(base_js_1.Vectors.fromPartial({
type: base_js_1.Vectors_VectorType.VECTOR_TYPE_SINGLE_FP32,
vectorBytes: _c.vectorToBytes(vector),
}));
}
vectorForTargets.push(vectorForTarget);
}
return args.targetVector !== undefined
? Object.assign(Object.assign({}, _c.targetVector(args)), { vectorForTargets }) : {
targetVectors: undefined,
targets: base_search_js_1.Targets.fromPartial({
targetVectors: vectorForTargets.map((v) => v.name),
}),
vectorForTargets,
};
}
if (args.vector.length === 0) {
throw invalidVectorError;
}
if (utils_js_1.NearVectorInputGuards.is1D(args.vector)) {
const { targetVectors, targets } = _c.targetVector(args);
const vectorBytes = _c.vectorToBytes(args.vector);
return args.supportsVectors
? {
targets,
targetVectors,
vectors: [base_js_1.Vectors.fromPartial({ type: base_js_1.Vectors_VectorType.VECTOR_TYPE_SINGLE_FP32, vectorBytes })],
}
: {
targets,
targetVectors,
vectorBytes,
};
}
if (utils_js_1.NearVectorInputGuards.is2D(args.vector)) {
if (!args.supportsVectors) {
throw new errors_js_1.WeaviateUnsupportedFeatureError('Multi-vectors are not supported in Weaviate <1.29.0');
}
const { targetVectors, targets } = _c.targetVector(args);
const vectorBytes = yield _c.vectorsToBytes(args.vector);
return {
targets,
targetVectors,
vectors: [base_js_1.Vectors.fromPartial({ type: base_js_1.Vectors_VectorType.VECTOR_TYPE_MULTI_FP32, vectorBytes })],
};
}
throw invalidVectorError;
});
Serialize.targets = (targets) => {
let combination;
switch (targets.combination) {
case 'sum':
combination = base_search_js_1.CombinationMethod.COMBINATION_METHOD_TYPE_SUM;
break;
case 'average':
combination = base_search_js_1.CombinationMethod.COMBINATION_METHOD_TYPE_AVERAGE;
break;
case 'minimum':
combination = base_search_js_1.CombinationMethod.COMBINATION_METHOD_TYPE_MIN;
break;
case 'relative-score':
combination = base_search_js_1.CombinationMethod.COMBINATION_METHOD_TYPE_RELATIVE_SCORE;
break;
case 'manual-weights':
combination = base_search_js_1.CombinationMethod.COMBINATION_METHOD_TYPE_MANUAL;
break;
default:
throw new Error('Invalid combination method');
}
if (targets.weights !== undefined) {
const weightsForTargets = Object.entries(targets.weights)
.map(([target, weight]) => {
return {
target,
weight: weight,
};
})
.reduce((acc, { target, weight }) => {
return Array.isArray(weight)
? acc.concat(weight.map((w) => ({ target, weight: w })))
: acc.concat([{ target, weight }]);
}, []);
return {
combination,
targetVectors: weightsForTargets.map((w) => w.target),
weightsForTargets,
};
}
else {
return {
combination,
targetVectors: targets.targetVectors,
weightsForTargets: [],
};
}
};
Serialize.nearVideoSearch = (args) => {
const { targets, targetVectors } = _c.targetVector(args);
return base_search_js_1.NearVideoSearch.fromPartial({
video: args.video,
certainty: args.certainty,
distance: args.distance,
targetVectors,
targets,
});
};
Serialize.filtersGRPC = (filters) => {
const resolveFilters = (filters) => {
var _d;
const out = [];
(_d = filters.filters) === null || _d === void 0 ? void 0 : _d.forEach((val) => out.push(_c.filtersGRPC(val)));
return out;
};
const { value } = filters;
switch (filters.operator) {
case 'And':
return base_js_1.Filters.fromPartial({
operator: base_js_1.Filters_Operator.OPERATOR_AND,
filters: resolveFilters(filters),
});
case 'Or':
return base_js_1.Filters.fromPartial({
operator: base_js_1.Filters_Operator.OPERATOR_OR,
filters: resolveFilters(filters),
});
case 'Not':
return base_js_1.Filters.fromPartial({
operator: base_js_1.Filters_Operator.OPERATOR_NOT,
filters: resolveFilters(filters),
});
default:
return base_js_1.Filters.fromPartial({
operator: _c.operator(filters.operator),
target: filters.target,
valueText: _c.filtersGRPCValueText(value),
valueTextArray: _c.filtersGRPCValueTextArray(value),
valueInt: FilterGuards.isInt(value) ? value : undefined,
valueIntArray: FilterGuards.isIntArray(value) ? { values: value } : undefined,
valueNumber: FilterGuards.isFloat(value) ? value : undefined,
valueNumberArray: FilterGuards.isFloatArray(value) ? { values: value } : undefined,
valueBoolean: FilterGuards.isBoolean(value) ? value : undefined,
valueBooleanArray: FilterGuards.isBooleanArray(value) ? { values: value } : undefined,
valueGeo: FilterGuards.isGeoRange(value) ? value : undefined,
});
}
};
Serialize.filtersGRPCValueText = (value) => {
if (FilterGuards.isText(value)) {
return value;
}
else if (FilterGuards.isDate(value)) {
return value.toISOString();
}
else {
return undefined;
}
};
Serialize.filtersGRPCValueTextArray = (value) => {
if (FilterGuards.isTextArray(value)) {
return { values: value };
}
else if (FilterGuards.isDateArray(value)) {
return { values: value.map((v) => v.toISOString()) };
}
else {
return undefined;
}
};
Serialize.filterTargetToREST = (target) => {
if (target.property) {
return [target.property];
}
else if (target.singleTarget) {
throw new errors_js_1.WeaviateSerializationError('Cannot use Filter.byRef() in the aggregate API currently. Instead use Filter.byRefMultiTarget() and specify the target collection explicitly.');
}
else if (target.multiTarget) {
if (target.multiTarget.target === undefined) {
throw new errors_js_1.WeaviateSerializationError(`target of multiTarget filter was unexpectedly undefined: ${target}`);
}
return [
target.multiTarget.on,
target.multiTarget.targetCollection,
..._c.filterTargetToREST(target.multiTarget.target),
];
}
else if (target.count) {
return [target.count.on];
}
else {
return [];
}
};
Serialize.filtersREST = (filters) => {
var _d;
const { value } = filters;
if (filters.operator === 'And' || filters.operator === 'Or' || filters.operator === 'Not') {
return {
operator: filters.operator,
operands: (_d = filters.filters) === null || _d === void 0 ? void 0 : _d.map(_c.filtersREST),
};
}
else {
if (filters.target === undefined) {
throw new errors_js_1.WeaviateSerializationError(`target of filter was unexpectedly undefined: ${filters}`);
}
const out = {
path: _c.filterTargetToREST(filters.target),
operator: filters.operator,
};
if (FilterGuards.isText(value)) {
return Object.assign(Object.assign({}, out), { valueText: value });
}
else if (FilterGuards.isTextArray(value)) {
return Object.assign(Object.assign({}, out), { valueTextArray: value });
}
else if (FilterGuards.isInt(value)) {
return Object.assign(Object.assign({}, out), { valueInt: value });
}
else if (FilterGuards.isIntArray(value)) {
return Object.assign(Object.assign({}, out), { valueIntArray: value });
}
else if (FilterGuards.isBoolean(value)) {
return Object.assign(Object.assign({}, out), { valueBoolean: value });
}
else if (FilterGuards.isBooleanArray(value)) {
return Object.assign(Object.assign({}, out), { valueBooleanArray: value });
}
else if (FilterGuards.isFloat(value)) {
return Object.assign(Object.assign({}, out), { valueNumber: value });
}
else if (FilterGuards.isFloatArray(value)) {
return Object.assign(Object.assign({}, out), { valueNumberArray: value });
}
else if (FilterGuards.isDate(value)) {
return Object.assign(Object.assign({}, out), { valueDate: value.toISOString() });
}
else if (FilterGuards.isDateArray(value)) {
return Object.assign(Object.assign({}, out), { valueDateArray: value.map((v) => v.toISOString()) });
}
else if (FilterGuards.isGeoRange(value)) {
return Object.assign(Object.assign({}, out), { valueGeoRange: {
geoCoordinates: {
latitude: value.latitude,
longitude: value.longitude,
},
distance: {
max: value.distance,
},
} });
}
else {
throw new errors_js_1.WeaviateInvalidInputError('Invalid filter value type');
}
}
};
Serialize.operator = (operator) => {
switch (operator) {
case 'Equal':
return base_js_1.F