import axios from "axios"; import { getDefaultHeaders } from "./session"; // Get API URL from environment or default to localhost in development const isHFSpace = window.location.hostname.includes("hf.space"); const API_URL = isHFSpace ? "" // URL relative pour HF Spaces : import.meta.env.VITE_API_URL || "http://localhost:8000"; // Create axios instance with default config const api = axios.create({ baseURL: API_URL, ...(isHFSpace && { baseURL: window.location.origin, }), }); // Add request interceptor to handle headers api.interceptors.request.use((config) => { // Routes qui ne nécessitent pas de session_id const noSessionRoutes = [ "/api/universe/generate", "/api/generate-image", "/api/text-to-speech", ]; if (noSessionRoutes.includes(config.url)) { return config; } // Pour toutes les autres requêtes, s'assurer qu'on a un session_id if (!config.headers["x-session-id"]) { throw new Error("Session ID is required for this request"); } return config; }); // Error handling middleware const handleApiError = (error) => { console.error("API Error:", { status: error.response?.status, statusText: error.response?.statusText, data: error.response?.data, config: { method: error.config?.method, url: error.config?.url, data: error.config?.data, }, }); if (error.response) { // La requête a été faite et le serveur a répondu avec un code d'erreur throw new Error( error.response.data?.message || `Erreur ${error.response.status}: ${error.response.statusText}` ); } else if (error.request) { // La requête a été faite mais aucune réponse n'a été reçue throw new Error("Aucune réponse du serveur"); } else { // Une erreur s'est produite lors de la configuration de la requête throw new Error( "Une erreur est survenue lors de la configuration de la requête" ); } }; // Story related API calls export const storyApi = { start: async (sessionId) => { try { const response = await api.post( "/api/chat", { message: "restart", }, { headers: getDefaultHeaders(sessionId), } ); return response.data; } catch (error) { return handleApiError(error); } }, makeChoice: async (choiceId, sessionId) => { try { const response = await api.post( "/api/chat", { message: "choice", choice_id: choiceId, }, { headers: getDefaultHeaders(sessionId), } ); return response.data; } catch (error) { return handleApiError(error); } }, generateImage: async ( prompt, width = 512, height = 512, sessionId = null ) => { try { const config = { prompt, width, height, }; const options = {}; if (sessionId) { options.headers = getDefaultHeaders(sessionId); } const response = await api.post("/api/generate-image", config, options); return response.data; } catch (error) { return handleApiError(error); } }, // Narration related API calls narrate: async (text, sessionId) => { try { const response = await api.post( "/api/text-to-speech", { text, }, { headers: getDefaultHeaders(sessionId), } ); return response.data; } catch (error) { return handleApiError(error); } }, }; // WebSocket URL export const WS_URL = import.meta.env.VITE_WS_URL || "ws://localhost:8000/ws"; export const universeApi = { generate: async () => { try { const response = await api.post("/api/universe/generate"); return response.data; } catch (error) { return handleApiError(error); } }, }; // Export the base API instance for other uses export default api;