
Product
A New Overview in our Dashboard
We redesigned Socket's first logged-in page to display rich and insightful visualizations about your repositories protected against supply chain threats.
voy-search
Advanced tools
🚜 Work in Progress
Voy is under active development. As a result, the API is not stable. Please be aware that there might be breaking changes before the upcoming 1.0 release.
A sneak peek of what we are working on:
- Built-in text transformation in WebAssembly: As of now, voy relies on JavaScript libraries like
transformers.js
to generate text embeddings. See Usage for more detail.- Index update: Currently it's required to re-build the index when a resource update occurs.
- TypeScript support: Due to the limitation of WASM tooling, complex data types are not auto-generated.
# with npm
npm i voy-search
# with Yarn
yarn add voy-search
# with pnpm
pnpm add voy-search
class Voy
The Voy class encapsulates an index and exposes all the public methods Voy has to offer.
class Voy {
/**
* By instantiating with a resource, Voy will construct the index. If the resource is
* absent, it will construct an empty index. Calling Voy.index() later on will override
* the empty index.
*
* @param {Resource | undefined} resource
*/
constructor(resource?: Resource);
/**
* Index given resource. Voy.index() is designed for the use case where a Voy instance
* is instantiated without a resource. It will override the existing index. If you'd like
* to keep the existing index, you can use Voy.add() to add your resource to the index.
*
* @param {Resource} resource
*/
index(resource: Resource): void;
/**
* Search top k results with given query embedding.
*
* @param {Float32Array} query: Query Embedding
* @param {number} k: Number of items in the search result
* @returns {SearchResult}
*/
search(query: Float32Array, k: number): SearchResult;
/**
* Add given resource to the index.
*
* @param {Resource} resource
*/
add(resource: Resource): void;
/**
* Remove given resource from the index.
*
* @param {Resource} resource
*/
remove(resource: Resource): void;
/**
* Remove all resources from the index.
*/
clear(): void;
}
interface Resource {
embeddings: Array<{
id: string; // id of the resource
title: string; // title of the resource
url: string; // url to the resource
embeddings: number[]; // embeddings of the resource
}>;
}
interface SearchResult {
neighbors: Array<{
id: string; // id of the resource
title: string; // title of the resource
url: string; // url to the resource
}>;
}
Besides the Voy class, Voy also exports all the instance methods as individual functions.
index(resource: Resource): SerializedIndex
It indexes the given resource and returns a serialized index.
Parameters
interface Resource {
embeddings: Array<{
id: string; // id of the resource
title: string; // title of the resource
url: string; // url to the resource
embeddings: number[]; // embeddings of the resource
}>;
}
Return
type SerializedIndex = string;
search(index: SerializedIndex, query: Query, k: NumberOfResult): SearchResult
It deserializes the given index and search for the k
nearest neighbors of the query.
Parameter
type SerializedIndex = string;
type Query = Float32Array; // embeddings of the search query
type NumberOfResult = number; // K top results to return
Return
interface SearchResult {
neighbors: Array<{
id: string; // id of the resource
title: string; // title of the resource
url: string; // url to the resource
}>;
}
add(index: SerializedIndex, resource: Resource): SerializedIndex
It adds resources to the index and returns an updated serialized index.
Parameter
type SerializedIndex = string;
interface Resource {
embeddings: Array<{
id: string; // id of the resource
title: string; // title of the resource
url: string; // url to the resource
embeddings: number[]; // embeddings of the resource
}>;
}
Return
type SerializedIndex = string;
remove(index: SerializedIndex, resource: Resource): SerializedIndex
It removes resources from the index and returns an updated serialized index.
Parameter
type SerializedIndex = string;
interface Resource {
embeddings: Array<{
id: string; // id of the resource
title: string; // title of the resource
url: string; // url to the resource
embeddings: number[]; // embeddings of the resource
}>;
}
Return
type SerializedIndex = string;
clear(index: SerializedIndex): SerializedIndex
It removes all items from the index and returns an empty serialized index.
Parameter
type SerializedIndex = string;
Return
type SerializedIndex = string;
As of now, voy relies on libraries like transformers.js
and web-ai
to generate embeddings for text:
import { TextModel } from "@visheratin/web-ai";
const { Voy } = await import("voy-search");
const phrases = [
"That is a very happy Person",
"That is a Happy Dog",
"Today is a sunny day",
];
const query = "That is a happy person";
// Create text embeddings
const model = await (await TextModel.create("gtr-t5-quant")).model;
const processed = await Promise.all(phrases.map((q) => model.process(q)));
// Index embeddings with voy
const data = processed.map(({ result }, i) => ({
id: String(i),
title: phrases[i],
url: `/path/${i}`,
embeddings: result,
}));
const resource = { embeddings: data };
const index = new Voy(resource);
// Perform similarity search for a query embeddings
const q = await model.process(query);
const result = index.search(q.result, 1);
// Display search result
result.neighbors.forEach((result) =>
console.log(`✨ voy similarity search result: "${result.title}"`)
);
import { TextModel } from "@visheratin/web-ai";
const { Voy } = await import("voy-search");
const phrases = [
"That is a very happy Person",
"That is a Happy Dog",
"Today is a sunny day",
"Sun flowers are blooming",
];
const model = await (await TextModel.create("gtr-t5-quant")).model;
const processed = await Promise.all(phrases.map((q) => model.process(q)));
const data = processed.map(({ result }, i) => ({
id: String(i),
title: phrases[i],
url: `/path/${i}`,
embeddings: result,
}));
const resourceA = { embeddings: data.slice(0, 2) };
const resourceB = { embeddings: data.slice(2) };
const indexA = new Voy(resourceA);
const indexB = new Voy(resourceB);
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
FAQs
a vector similarity search engine in WASM
The npm package voy-search receives a total of 1,229 weekly downloads. As such, voy-search popularity was classified as popular.
We found that voy-search demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
We redesigned Socket's first logged-in page to display rich and insightful visualizations about your repositories protected against supply chain threats.
Product
Automatically fix and test dependency updates with socket fix—a new CLI tool that turns CVE alerts into safe, automated upgrades.
Security News
CISA denies CVE funding issues amid backlash over a new CVE foundation formed by board members, raising concerns about transparency and program governance.