@searcly/sdk
Version:
Searcly Visual Search SDK for JavaScript
78 lines (66 loc) • 1.96 kB
text/typescript
import axios, { AxiosInstance } from 'axios';
import FormData from 'form-data';
export interface SearclyConfig {
apiKey: string;
baseUrl?: string;
}
export interface SearchOptions {
limit?: number;
offset?: number;
filters?: Record<string, any>;
}
export interface SearchResponse {
results: Array<{
id: string;
score: number;
metadata: Record<string, any>;
}>;
total: number;
}
export class SearclyClient {
private client: AxiosInstance;
private baseUrl: string;
constructor(config: SearclyConfig) {
this.baseUrl = config.baseUrl || 'https://api.searcly.com/v1';
this.client = axios.create({
baseURL: this.baseUrl,
headers: {
'Authorization': `Bearer ${config.apiKey}`,
'Content-Type': 'application/json',
},
});
}
async searchByImage(imageUrl: string, options: SearchOptions = {}): Promise<SearchResponse> {
const response = await this.client.post('/search', {
image_url: imageUrl,
...options,
});
return response.data;
}
async searchByImageUpload(imageFile: Buffer | Blob, options: SearchOptions = {}): Promise<SearchResponse> {
const formData = new FormData();
formData.append('image', imageFile);
if (options.filters) {
formData.append('filters', JSON.stringify(options.filters));
}
if (options.limit) {
formData.append('limit', options.limit.toString());
}
if (options.offset) {
formData.append('offset', options.offset.toString());
}
const response = await this.client.post('/search/upload', formData, {
headers: {
...formData.getHeaders(),
},
});
return response.data;
}
async searchById(productId: string, options: SearchOptions = {}): Promise<SearchResponse> {
const response = await this.client.get(`/products/${productId}/similar`, {
params: options,
});
return response.data;
}
}
export default SearclyClient;