@neureus/sdk
Version:
Neureus Platform SDK - AI-native, edge-first application platform
243 lines (241 loc) • 6.42 kB
JavaScript
import ky from 'ky';
// src/vector.ts
var VectorClient = class {
http;
config;
constructor(config) {
this.config = {
apiKey: config.apiKey,
baseUrl: config.baseUrl || "https://api.neureus.ai",
timeout: config.timeout || 3e4,
retries: config.retries || 3,
indexName: config.indexName || "default",
...config.namespace !== void 0 && { namespace: config.namespace }
};
this.http = ky.create({
prefixUrl: this.config.baseUrl,
timeout: this.config.timeout,
retry: {
limit: this.config.retries,
methods: ["get", "post", "delete"],
statusCodes: [408, 413, 429, 500, 502, 503, 504]
},
hooks: {
beforeRequest: [
(request) => {
request.headers.set("Authorization", `Bearer ${this.config.apiKey}`);
request.headers.set("Content-Type", "application/json");
request.headers.set("User-Agent", "Neureus-SDK/0.2.0");
}
]
}
});
}
/**
* Index management API
*/
indices = {
/**
* Create a new vector index
*
* @example
* ```typescript
* await vectors.indices.create({
* name: 'documents',
* dimension: 1536, // OpenAI ada-002 dimensions
* metric: 'cosine',
* indexType: 'hnsw'
* });
* ```
*/
create: async (config) => {
return this.http.post("vector/indices", {
json: config
}).json();
},
/**
* List all indices
*
* @example
* ```typescript
* const indices = await vectors.indices.list();
* console.log(indices); // [{ name: 'documents', dimension: 1536, ... }]
* ```
*/
list: async () => {
return this.http.get("vector/indices").json();
},
/**
* Get index statistics
*
* @example
* ```typescript
* const stats = await vectors.indices.stats('documents');
* console.log(stats.vectorCount, stats.memoryUsage);
* ```
*/
stats: async (indexName) => {
return this.http.get(`vector/indices/${indexName}/stats`).json();
},
/**
* Drop (delete) an index
*
* @example
* ```typescript
* await vectors.indices.drop('old-index');
* ```
*/
drop: async (indexName) => {
return this.http.delete(`vector/indices/${indexName}`).json();
}
};
/**
* Upsert (insert or update) a single vector
*
* @example
* ```typescript
* const id = await vectors.upsert({
* vectors: [{
* id: 'doc1',
* vector: [0.1, 0.2, ...], // embedding vector
* metadata: { title: 'Document 1', page: 1 }
* }]
* });
* ```
*/
async upsert(options) {
const { vectors, namespace, indexName } = options;
if (vectors.length > 1) {
return this.http.post("vector/vectors/batch", {
json: {
batch: {
vectors,
namespace: namespace || this.config.namespace
},
indexName: indexName || this.config.indexName
}
}).json();
}
const result = await this.http.post("vector/vectors", {
json: {
vector: vectors[0],
namespace: namespace || this.config.namespace,
indexName: indexName || this.config.indexName
}
}).json();
return {
success: result.success,
ids: [result.id],
count: 1,
message: result.message
};
}
/**
* Get a vector by ID
*
* @example
* ```typescript
* const vector = await vectors.get('doc1');
* console.log(vector.metadata, vector.vector);
* ```
*/
async get(id, namespace) {
const params = new URLSearchParams();
if (namespace || this.config.namespace) {
params.set("namespace", namespace || this.config.namespace);
}
return this.http.get(`vector/vectors/${id}`, { searchParams: params }).json();
}
/**
* Delete a vector by ID
*
* @example
* ```typescript
* await vectors.delete('doc1');
* ```
*/
async delete(id, namespace, indexName) {
const params = new URLSearchParams();
if (namespace || this.config.namespace) {
params.set("namespace", namespace || this.config.namespace);
}
params.set("indexName", indexName || this.config.indexName);
return this.http.delete(`vector/vectors/${id}`, { searchParams: params }).json();
}
/**
* Search for similar vectors
*
* @example
* ```typescript
* const results = await vectors.search({
* vector: [0.1, 0.2, ...], // query embedding
* topK: 5,
* minSimilarity: 0.7,
* filter: { page: { $gt: 10 } }
* });
*
* for (const result of results.matches) {
* console.log(result.id, result.score, result.metadata);
* }
* ```
*/
async search(options) {
const { indexName, ...searchQuery } = options;
return this.http.post("vector/search", {
json: {
query: {
...searchQuery,
namespace: searchQuery.namespace || this.config.namespace
},
indexName: indexName || this.config.indexName
}
}).json();
}
/**
* Hybrid search (vector + keyword)
*
* Combines vector similarity search with keyword/text search
* for better retrieval accuracy.
*
* @example
* ```typescript
* const results = await vectors.hybridSearch({
* vector: [0.1, 0.2, ...],
* query: 'machine learning',
* topK: 10,
* alpha: 0.7 // 70% vector, 30% keyword
* });
* ```
*/
async hybridSearch(options) {
const { indexName, ...searchQuery } = options;
return this.http.post("vector/search/hybrid", {
json: {
query: {
...searchQuery,
namespace: searchQuery.namespace || this.config.namespace
},
indexName: indexName || this.config.indexName
}
}).json();
}
/**
* Clear all vectors in a namespace
*
* @example
* ```typescript
* await vectors.clear('temporary-docs');
* ```
*/
async clear(namespace, indexName) {
const params = new URLSearchParams();
params.set("indexName", indexName || this.config.indexName);
return this.http.delete(`vector/namespaces/${namespace}`, { searchParams: params }).json();
}
};
function createVectorClient(config) {
return new VectorClient(config);
}
export { VectorClient, createVectorClient };
//# sourceMappingURL=vector.js.map
//# sourceMappingURL=vector.js.map