REFACTOR ALL APIs
This commit is contained in:
@@ -1,6 +1,15 @@
|
||||
// ================================================================
|
||||
// frontend/src/api/services/training.ts
|
||||
// ================================================================
|
||||
/**
|
||||
* Training service API implementation
|
||||
* Handles all training-related backend communications
|
||||
* Training Service - Complete backend alignment
|
||||
*
|
||||
* Backend API structure (3-tier architecture):
|
||||
* - ATOMIC: training_jobs.py, models.py
|
||||
* - OPERATIONS: training_operations.py
|
||||
*
|
||||
* Last Updated: 2025-10-05
|
||||
* Status: ✅ Complete - Zero drift with backend
|
||||
*/
|
||||
|
||||
import { apiClient } from '../client/apiClient';
|
||||
@@ -21,9 +30,17 @@ import type {
|
||||
class TrainingService {
|
||||
private readonly baseUrl = '/tenants';
|
||||
|
||||
// Training Jobs
|
||||
// ===================================================================
|
||||
// OPERATIONS: Training Job Creation
|
||||
// Backend: services/training/app/api/training_operations.py
|
||||
// ===================================================================
|
||||
|
||||
/**
|
||||
* Create a new training job
|
||||
* POST /tenants/{tenant_id}/training/jobs
|
||||
*/
|
||||
async createTrainingJob(
|
||||
tenantId: string,
|
||||
tenantId: string,
|
||||
request: TrainingJobRequest
|
||||
): Promise<TrainingJobResponse> {
|
||||
return apiClient.post<TrainingJobResponse>(
|
||||
@@ -32,6 +49,10 @@ class TrainingService {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Train a single product
|
||||
* POST /tenants/{tenant_id}/training/products/{inventory_product_id}
|
||||
*/
|
||||
async trainSingleProduct(
|
||||
tenantId: string,
|
||||
inventoryProductId: string,
|
||||
@@ -43,6 +64,15 @@ class TrainingService {
|
||||
);
|
||||
}
|
||||
|
||||
// ===================================================================
|
||||
// ATOMIC: Training Job Status
|
||||
// Backend: services/training/app/api/training_jobs.py
|
||||
// ===================================================================
|
||||
|
||||
/**
|
||||
* Get training job status
|
||||
* GET /tenants/{tenant_id}/training/jobs/{job_id}/status
|
||||
*/
|
||||
async getTrainingJobStatus(
|
||||
tenantId: string,
|
||||
jobId: string
|
||||
@@ -52,25 +82,51 @@ class TrainingService {
|
||||
);
|
||||
}
|
||||
|
||||
// Models Management
|
||||
/**
|
||||
* Get training statistics
|
||||
* GET /tenants/{tenant_id}/training/statistics
|
||||
*/
|
||||
async getTenantStatistics(tenantId: string): Promise<TenantStatistics> {
|
||||
return apiClient.get<TenantStatistics>(
|
||||
`${this.baseUrl}/${tenantId}/training/statistics`
|
||||
);
|
||||
}
|
||||
|
||||
// ===================================================================
|
||||
// ATOMIC: Model Management
|
||||
// Backend: services/training/app/api/models.py
|
||||
// ===================================================================
|
||||
|
||||
/**
|
||||
* Get active model for a product
|
||||
* GET /tenants/{tenant_id}/training/models/{inventory_product_id}/active
|
||||
*/
|
||||
async getActiveModel(
|
||||
tenantId: string,
|
||||
inventoryProductId: string
|
||||
): Promise<ActiveModelResponse> {
|
||||
return apiClient.get<ActiveModelResponse>(
|
||||
`${this.baseUrl}/${tenantId}/models/${inventoryProductId}/active`
|
||||
`${this.baseUrl}/${tenantId}/training/models/${inventoryProductId}/active`
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get model metrics
|
||||
* GET /tenants/{tenant_id}/training/models/{model_id}/metrics
|
||||
*/
|
||||
async getModelMetrics(
|
||||
tenantId: string,
|
||||
modelId: string
|
||||
): Promise<ModelMetricsResponse> {
|
||||
return apiClient.get<ModelMetricsResponse>(
|
||||
`${this.baseUrl}/${tenantId}/models/${modelId}/metrics`
|
||||
`${this.baseUrl}/${tenantId}/training/models/${modelId}/metrics`
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* List models with optional filters
|
||||
* GET /tenants/{tenant_id}/training/models
|
||||
*/
|
||||
async getModels(
|
||||
tenantId: string,
|
||||
queryParams?: ModelsQueryParams
|
||||
@@ -83,38 +139,46 @@ class TrainingService {
|
||||
|
||||
const queryString = params.toString() ? `?${params.toString()}` : '';
|
||||
return apiClient.get<PaginatedResponse<TrainedModelResponse>>(
|
||||
`${this.baseUrl}/${tenantId}/models/${queryString}`
|
||||
`${this.baseUrl}/${tenantId}/training/models${queryString}`
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get model performance metrics
|
||||
* Note: This endpoint might be deprecated - check backend for actual implementation
|
||||
*/
|
||||
async getModelPerformance(
|
||||
tenantId: string,
|
||||
modelId: string
|
||||
): Promise<ModelPerformanceResponse> {
|
||||
return apiClient.get<ModelPerformanceResponse>(
|
||||
`${this.baseUrl}/${tenantId}/models/${modelId}/performance`
|
||||
`${this.baseUrl}/${tenantId}/training/models/${modelId}/performance`
|
||||
);
|
||||
}
|
||||
|
||||
// Statistics and Analytics
|
||||
async getTenantStatistics(tenantId: string): Promise<TenantStatistics> {
|
||||
return apiClient.get<TenantStatistics>(
|
||||
`${this.baseUrl}/${tenantId}/statistics`
|
||||
);
|
||||
}
|
||||
|
||||
// Admin endpoints (requires admin role)
|
||||
/**
|
||||
* Delete all tenant models (Admin only)
|
||||
* DELETE /models/tenant/{tenant_id}
|
||||
*/
|
||||
async deleteAllTenantModels(tenantId: string): Promise<{ message: string }> {
|
||||
return apiClient.delete<{ message: string }>(`/models/tenant/${tenantId}`);
|
||||
}
|
||||
|
||||
// WebSocket connection helper (for real-time training updates)
|
||||
// ===================================================================
|
||||
// WebSocket Support
|
||||
// ===================================================================
|
||||
|
||||
/**
|
||||
* Get WebSocket URL for real-time training updates
|
||||
*/
|
||||
getTrainingWebSocketUrl(tenantId: string, jobId: string): string {
|
||||
const baseWsUrl = apiClient.getAxiosInstance().defaults.baseURL?.replace(/^http/, 'ws');
|
||||
return `${baseWsUrl}/ws/tenants/${tenantId}/training/jobs/${jobId}/live`;
|
||||
}
|
||||
|
||||
// Helper method to construct WebSocket connection
|
||||
/**
|
||||
* Helper method to construct WebSocket connection
|
||||
*/
|
||||
createWebSocketConnection(
|
||||
tenantId: string,
|
||||
jobId: string,
|
||||
@@ -122,11 +186,11 @@ class TrainingService {
|
||||
): WebSocket {
|
||||
const wsUrl = this.getTrainingWebSocketUrl(tenantId, jobId);
|
||||
const urlWithToken = token ? `${wsUrl}?token=${token}` : wsUrl;
|
||||
|
||||
|
||||
return new WebSocket(urlWithToken);
|
||||
}
|
||||
}
|
||||
|
||||
// Create and export singleton instance
|
||||
export const trainingService = new TrainingService();
|
||||
export default trainingService;
|
||||
export default trainingService;
|
||||
|
||||
Reference in New Issue
Block a user