Mexar / frontend /src /api /client.js
Devrajsinh bharatsinh gohil
Initial commit of MEXAR Ultimate - Phase 2 cleanup complete
b0b150b
/**
* MEXAR API Client - Phase 2
* Clean API client aligned with backend endpoints.
*/
import axios from 'axios';
// API Base URL - uses environment variable for production
const API_BASE_URL = process.env.REACT_APP_API_URL || 'http://127.0.0.1:8000';
// Create axios instance
const client = axios.create({
baseURL: API_BASE_URL,
headers: {
'Content-Type': 'application/json',
},
});
// Add JWT token interceptor
client.interceptors.request.use(
(config) => {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
(error) => Promise.reject(error)
);
// ===== AUTHENTICATION =====
export const login = async (email, password) => {
const response = await client.post('/api/auth/login', { email, password });
return response.data;
};
export const register = async (email, password) => {
const response = await client.post('/api/auth/register', { email, password });
return response.data;
};
export const getCurrentUser = async () => {
const response = await client.get('/api/auth/me');
return response.data;
};
export const changePassword = async (oldPassword, newPassword) => {
const response = await client.post('/api/auth/change-password', {
old_password: oldPassword,
new_password: newPassword
});
return response.data;
};
// ===== AGENTS =====
export const listAgents = async () => {
const response = await client.get('/api/agents/');
// Frontend expects { agents: [...] }
return { agents: response.data };
};
export const getAgent = async (agentName) => {
const response = await client.get(`/api/agents/${agentName}`);
return response.data;
};
export const deleteAgent = async (agentName) => {
const response = await client.delete(`/api/agents/${agentName}`);
return response.data;
};
export const getAgentGraph = async (agentName) => {
const response = await client.get(`/api/agents/${agentName}/graph`);
return response.data;
};
// ===== COMPILATION =====
export const compileAgent = async (name, systemPrompt, files) => {
const formData = new FormData();
formData.append('agent_name', name);
formData.append('system_prompt', systemPrompt);
files.forEach(file => formData.append('files', file));
const response = await client.post('/api/compile/', formData, {
headers: { 'Content-Type': 'multipart/form-data' }
});
return response.data;
};
export const getCompileStatus = async (agentName) => {
const response = await client.get(`/api/compile/${agentName}/status`);
return response.data;
};
// ===== CHAT =====
export const sendMessage = async (agentName, message, includeTTS = false, ttsProvider = 'elevenlabs') => {
const response = await client.post('/api/chat/', {
agent_name: agentName,
message: message,
include_explainability: true,
include_tts: includeTTS,
tts_provider: ttsProvider
});
return response.data;
};
export const sendMultimodalMessage = async (agentName, message, audio = null, image = null, includeTTS = false, ttsProvider = 'elevenlabs') => {
const formData = new FormData();
formData.append('agent_name', agentName);
formData.append('message', message);
formData.append('include_tts', includeTTS);
formData.append('tts_provider', ttsProvider);
if (audio) formData.append('audio', audio);
if (image) formData.append('image', image);
const response = await client.post('/api/chat/multimodal', formData, {
headers: { 'Content-Type': 'multipart/form-data' }
});
return response.data;
};
export const getChatHistory = async (agentName, limit = 50) => {
const response = await client.get(`/api/chat/${agentName}/history?limit=${limit}`);
return response.data;
};
export const clearChatHistory = async (agentName) => {
const response = await client.delete(`/api/chat/${agentName}/history`);
return response.data;
};
// ===== TEXT-TO-SPEECH =====
export const generateTTS = async (text, provider = 'elevenlabs', voiceId = null) => {
const response = await client.post('/api/chat/tts/generate', {
text,
provider,
voice_id: voiceId
});
return response.data;
};
export const getTTSVoices = async (provider = 'elevenlabs') => {
const response = await client.get(`/api/chat/tts/voices?provider=${provider}`);
return response.data;
};
export const getTTSQuota = async () => {
const response = await client.get('/api/chat/tts/quota');
return response.data;
};
export const getTTSAudioURL = (filename) => {
return `${API_BASE_URL}/api/chat/tts/audio/${filename}`;
};
// ===== LIVE AUDIO TRANSCRIPTION =====
export const transcribeAudio = async (audioBlob, language = 'en') => {
const formData = new FormData();
formData.append('audio', audioBlob, 'recording.webm');
formData.append('language', language);
const response = await client.post('/api/chat/transcribe', formData, {
headers: { 'Content-Type': 'multipart/form-data' }
});
return response.data;
};
// ===== VALIDATION & PROMPTS =====
export const validateFiles = async (files) => {
const formData = new FormData();
files.forEach(file => formData.append('files', file));
const response = await client.post('/api/validate', formData, {
headers: { 'Content-Type': 'multipart/form-data' }
});
return response.data;
};
export const analyzePrompt = async (prompt) => {
const response = await client.post('/api/analyze-prompt', { prompt });
return response.data;
};
export const getPromptTemplates = async () => {
const response = await client.get('/api/prompt-templates');
return response.data;
};
// Legacy alias for backward compatibility
export const checkAgentStatus = getAgent;
export default client;