UNPKG

@searcly/sdk

Version:
78 lines (66 loc) 1.96 kB
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;