Spaces:
Paused
Paused
| 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(); | |