Spaces:
Running
Running
| import axios from 'axios'; | |
| // API 基础路径配置 | |
| // 开发环境和生产环境都使用 /api 前缀 | |
| // 后端路由在 main.py 中以 /api 为前缀注册 | |
| const getBaseURL = () => { | |
| return '/api'; | |
| }; | |
| const api = axios.create({ | |
| baseURL: getBaseURL(), | |
| timeout: 30000, // 默认30秒超时,各端点可单独覆盖 | |
| }); | |
| // 请求拦截器 | |
| api.interceptors.request.use( | |
| (config) => { | |
| const cardKey = localStorage.getItem('cardKey'); | |
| if (cardKey) { | |
| config.params = { | |
| ...config.params, | |
| card_key: cardKey, | |
| }; | |
| } | |
| return config; | |
| }, | |
| (error) => { | |
| return Promise.reject(error); | |
| } | |
| ); | |
| // 响应拦截器 | |
| api.interceptors.response.use( | |
| (response) => { | |
| return response; | |
| }, | |
| (error) => { | |
| if (error.response?.status === 401) { | |
| localStorage.removeItem('cardKey'); | |
| window.location.href = '/'; | |
| } | |
| return Promise.reject(error); | |
| } | |
| ); | |
| // Admin API | |
| export const adminAPI = { | |
| generateKeys: (data, password) => | |
| api.post('/admin/generate-keys', data, { | |
| params: { admin_password: password }, | |
| }), | |
| listUsers: (password) => | |
| api.get('/admin/users', { | |
| params: { admin_password: password }, | |
| }), | |
| deleteUser: (userId, password) => | |
| api.delete(`/admin/users/${userId}`, { | |
| params: { admin_password: password }, | |
| }), | |
| stopSession: (sessionId, password) => | |
| api.post(`/admin/sessions/${sessionId}/stop`, null, { | |
| params: { admin_password: password }, | |
| }), | |
| toggleUserActive: (userId, password) => | |
| api.put(`/admin/users/${userId}/toggle-active`, null, { | |
| params: { admin_password: password }, | |
| }), | |
| }; | |
| // Prompts API | |
| export const promptsAPI = { | |
| getSystemPrompts: () => api.get('/prompts/system'), | |
| getUserPrompts: (stage = null) => | |
| api.get('/prompts/', { | |
| params: stage ? { stage } : {}, | |
| }), | |
| createPrompt: (data) => api.post('/prompts/', data), | |
| updatePrompt: (promptId, data) => api.put(`/prompts/${promptId}`, data), | |
| deletePrompt: (promptId) => api.delete(`/prompts/${promptId}`), | |
| setDefaultPrompt: (promptId) => | |
| api.post(`/prompts/${promptId}/set-default`), | |
| }; | |
| // Optimization API | |
| export const optimizationAPI = { | |
| startOptimization: (data) => api.post('/optimization/start', data, { | |
| timeout: 60000, // 启动任务延长到60秒超时 | |
| }), | |
| getQueueStatus: (sessionId = null) => | |
| api.get('/optimization/status', { | |
| params: sessionId ? { session_id: sessionId } : {}, | |
| timeout: 10000, // 10秒超时 | |
| }), | |
| listSessions: () => api.get('/optimization/sessions', { | |
| timeout: 15000, // 15秒超时 | |
| }), | |
| getSessionDetail: (sessionId) => | |
| api.get(`/optimization/sessions/${sessionId}`, { | |
| timeout: 20000, // 20秒超时 | |
| }), | |
| getSessionProgress: (sessionId) => | |
| api.get(`/optimization/sessions/${sessionId}/progress`, { | |
| timeout: 10000, // 10秒超时 | |
| }), | |
| getSessionChanges: (sessionId) => | |
| api.get(`/optimization/sessions/${sessionId}/changes`, { | |
| timeout: 20000, // 20秒超时 | |
| }), | |
| stopSession: (sessionId) => | |
| api.post(`/optimization/sessions/${sessionId}/stop`, null, { | |
| timeout: 10000, // 10秒超时 | |
| }), | |
| exportSession: (sessionId, confirmation) => | |
| api.post(`/optimization/sessions/${sessionId}/export`, confirmation, { | |
| timeout: 30000, // 30秒超时 | |
| }), | |
| deleteSession: (sessionId) => | |
| api.delete(`/optimization/sessions/${sessionId}`, { | |
| timeout: 10000, // 10秒超时 | |
| }), | |
| retryFailedSegments: (sessionId) => | |
| api.post(`/optimization/sessions/${sessionId}/retry`, null, { | |
| timeout: 15000, // 15秒超时 | |
| }), | |
| getStreamUrl: (sessionId) => { | |
| const cardKey = localStorage.getItem('cardKey'); | |
| const baseUrl = api.defaults.baseURL || '/api'; | |
| return `${baseUrl}/optimization/sessions/${sessionId}/stream?card_key=${cardKey}`; | |
| }, | |
| }; | |
| // Health API | |
| export const healthAPI = { | |
| checkModels: () => api.get('/health/models', { | |
| timeout: 15000, // 15秒超时 | |
| }), | |
| }; | |
| // Word Formatter API | |
| export const wordFormatterAPI = { | |
| // Usage info (shared with polishing) | |
| getUsage: () => api.get('/word-formatter/usage'), | |
| // Built-in Specs | |
| listSpecs: () => api.get('/word-formatter/specs'), | |
| getSpecSchema: () => api.get('/word-formatter/specs/schema'), | |
| validateSpec: (specJson) => | |
| api.post('/word-formatter/specs/validate', null, { | |
| params: { spec_json: specJson }, | |
| }), | |
| generateSpec: (requirements) => | |
| api.post('/word-formatter/specs/generate', { requirements }, { | |
| timeout: 120000, // AI generation may take time | |
| }), | |
| // Saved Specs (user's custom specs) | |
| saveSpec: (name, specJson, description = null) => | |
| api.post('/word-formatter/specs/save', { | |
| name, | |
| spec_json: specJson, | |
| description, | |
| }), | |
| listSavedSpecs: () => api.get('/word-formatter/specs/saved'), | |
| getSavedSpec: (specId) => api.get(`/word-formatter/specs/saved/${specId}`), | |
| deleteSavedSpec: (specId) => api.delete(`/word-formatter/specs/saved/${specId}`), | |
| // Format text | |
| formatText: (data) => | |
| api.post('/word-formatter/format/text', data, { | |
| timeout: 60000, | |
| }), | |
| // Format file | |
| formatFile: (file, options = {}) => { | |
| const formData = new FormData(); | |
| formData.append('file', file); | |
| return api.post('/word-formatter/format/file', formData, { | |
| headers: { 'Content-Type': 'multipart/form-data' }, | |
| params: options, | |
| timeout: 120000, | |
| }); | |
| }, | |
| // Jobs | |
| getJobStatus: (jobId) => api.get(`/word-formatter/jobs/${jobId}`), | |
| listJobs: (limit = 10) => | |
| api.get('/word-formatter/jobs', { params: { limit } }), | |
| deleteJob: (jobId) => api.delete(`/word-formatter/jobs/${jobId}`), | |
| getJobReport: (jobId) => api.get(`/word-formatter/jobs/${jobId}/report`), | |
| // Download | |
| getDownloadUrl: (jobId) => { | |
| const cardKey = localStorage.getItem('cardKey'); | |
| const baseUrl = api.defaults.baseURL || '/api'; | |
| return `${baseUrl}/word-formatter/jobs/${jobId}/download?card_key=${cardKey}`; | |
| }, | |
| // SSE stream URL | |
| getStreamUrl: (jobId) => { | |
| const cardKey = localStorage.getItem('cardKey'); | |
| const baseUrl = api.defaults.baseURL || '/api'; | |
| return `${baseUrl}/word-formatter/jobs/${jobId}/stream?card_key=${cardKey}`; | |
| }, | |
| // Preprocess text | |
| preprocessText: (text, options = {}) => | |
| api.post('/word-formatter/preprocess/text', { | |
| text, | |
| chunk_paragraphs: options.chunkParagraphs || 40, | |
| chunk_chars: options.chunkChars || 8000, | |
| }, { | |
| timeout: 60000, | |
| }), | |
| // Preprocess file | |
| preprocessFile: (file, options = {}) => { | |
| const formData = new FormData(); | |
| formData.append('file', file); | |
| return api.post('/word-formatter/preprocess/file', formData, { | |
| headers: { 'Content-Type': 'multipart/form-data' }, | |
| params: { | |
| chunk_paragraphs: options.chunkParagraphs || 40, | |
| chunk_chars: options.chunkChars || 8000, | |
| }, | |
| timeout: 120000, | |
| }); | |
| }, | |
| // Preprocess stream URL | |
| getPreprocessStreamUrl: (jobId) => { | |
| const cardKey = localStorage.getItem('cardKey'); | |
| const baseUrl = api.defaults.baseURL || '/api'; | |
| return `${baseUrl}/word-formatter/preprocess/${jobId}/stream?card_key=${cardKey}`; | |
| }, | |
| // Get preprocess result | |
| getPreprocessResult: (jobId) => | |
| api.get(`/word-formatter/preprocess/${jobId}/result`), | |
| // Delete preprocess job | |
| deletePreprocessJob: (jobId) => | |
| api.delete(`/word-formatter/preprocess/${jobId}`), | |
| // ============ Format Check API (No AI Required) ============ | |
| // Get paragraph types | |
| getFormatParagraphTypes: () => | |
| api.get('/word-formatter/format-check/types'), | |
| // Check text format (synchronous) | |
| checkTextFormat: (text, mode = 'loose') => | |
| api.post('/word-formatter/format-check/text', { text, mode }, { | |
| timeout: 30000, | |
| }), | |
| // Check file format (synchronous) | |
| checkFileFormat: (file, mode = 'loose') => { | |
| const formData = new FormData(); | |
| formData.append('file', file); | |
| return api.post('/word-formatter/format-check/file', formData, { | |
| headers: { 'Content-Type': 'multipart/form-data' }, | |
| params: { mode }, | |
| timeout: 60000, | |
| }); | |
| }, | |
| }; | |
| export default api; | |