ML-LT / src /services /api.service.js
wokogaming's picture
Upload 57 files
05abd64 verified
import axios from 'axios';
const rawApiUrl = import.meta.env.VITE_API_URL || 'http://localhost:5000';
const API_URL = (() => {
const trimmedUrl = rawApiUrl.replace(/\/+$/, '');
try {
const parsedUrl = new URL(trimmedUrl);
// If only an origin is provided, default to the backend API namespace.
if (!parsedUrl.pathname || parsedUrl.pathname === '/') {
parsedUrl.pathname = '/api';
return parsedUrl.toString().replace(/\/+$/, '');
}
return trimmedUrl;
} catch {
// Support relative API URLs while keeping explicit path configuration intact.
if (!trimmedUrl || trimmedUrl === '.') return '/api';
return trimmedUrl.startsWith('/') ? trimmedUrl : `/${trimmedUrl}`;
}
})();
class ApiService {
constructor() {
this.client = axios.create({
baseURL: API_URL,
headers: {
'Content-Type': 'application/json'
}
});
}
async search(query, options = {}) {
const response = await this.client.post('/search', {
query,
language: options.language,
freshness: options.freshness
});
return response.data;
}
async searchAndSummarize(query, options = {}) {
const response = await this.client.post('/search-summarize', {
query,
language: options.language,
freshness: options.freshness
});
return response.data;
}
async scrapeAndSummarize(urls, query = '') {
const response = await this.client.post('/scrape-summarize', { urls, query });
return response.data;
}
async scrape(url) {
const response = await this.client.post('/scrape', { url });
return response.data;
}
async generateWithGemini(prompt) {
const response = await this.client.post('/gemini', { prompt });
return response.data;
}
async summarizeNews(content, title) {
const response = await this.client.post('/gemini/summarize', { content, title });
return response.data;
}
async healthCheck() {
const response = await this.client.get('/health');
return response.data;
}
async createTtsJob(text, options = {}) {
const response = await this.client.post('/tts/jobs', {
text,
language: options.language || 'vi',
speaker_audio: options.speakerAudio
});
return response.data;
}
async getTtsJob(key) {
const response = await this.client.get(`/tts/jobs/${encodeURIComponent(key)}`);
return response.data;
}
}
export default new ApiService();