@searcly/sdk
Version:
Searcly Visual Search SDK for JavaScript
105 lines (94 loc) • 2.9 kB
text/typescript
import axios, { AxiosInstance, AxiosError } from 'axios';
import FormData from 'form-data';
import {
SearclyConfig,
ImageAnalysisOptions,
SearchOptions,
AnalysisResult,
SearchResult,
BulkAnalysisRequest
} from './types';
import { SearclyError } from './errors';
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',
},
});
// Add response interceptor for error handling
this.client.interceptors.response.use(
response => response,
(error: AxiosError) => {
if (error.response) {
throw new SearclyError(
(error.response.data as any)?.message || 'API request failed',
error.response.status,
error.response.data
);
} else if (error.request) {
throw new SearclyError('No response received from API');
} else {
throw new SearclyError('Error setting up request');
}
}
);
}
async analyzeImage(
imageUrl: string,
options: ImageAnalysisOptions = {}
): Promise<AnalysisResult> {
const response = await this.client.post('/api/v1/analyze-image', {
image_url: imageUrl,
...options,
});
return response.data;
}
async analyzeImageUpload(
imageFile: Buffer | Blob,
options: ImageAnalysisOptions = {}
): Promise<AnalysisResult> {
const formData = new FormData();
formData.append('image', imageFile);
formData.append('options', JSON.stringify(options));
const response = await this.client.post('/api/v1/analyze-image', formData, {
headers: {
...formData.getHeaders(),
},
});
return response.data;
}
async searchProducts(
imageUrl: string,
options: SearchOptions = {}
): Promise<SearchResult[]> {
const response = await this.client.post('/api/v1/search-products', {
image_url: imageUrl,
...options,
});
return response.data.results;
}
async searchProductsByUpload(
imageFile: Buffer | Blob,
options: SearchOptions = {}
): Promise<SearchResult[]> {
const formData = new FormData();
formData.append('image', imageFile);
formData.append('options', JSON.stringify(options));
const response = await this.client.post('/api/v1/search-products', formData, {
headers: {
...formData.getHeaders(),
},
});
return response.data.results;
}
async bulkAnalyze(request: BulkAnalysisRequest): Promise<Record<string, AnalysisResult>> {
const response = await this.client.post('/api/v1/bulk-analyze', request);
return response.data.results;
}
}