Spaces:
Runtime error
Runtime error
| # A/B Test Predictor API - Integration Guide for Backend | |
| ## API Endpoint | |
| ``` | |
| https://nitish-spz-abtestpredictorv2.hf.space | |
| ``` | |
| ## Available Endpoints | |
| ### 1. Auto-Categorization Prediction | |
| **Endpoint:** `/call/predict_with_auto_categorization` | |
| **Method:** POST | |
| **Description:** Automatically categorizes images and predicts A/B test winner | |
| **Request Format:** | |
| ```json | |
| { | |
| "data": [ | |
| { | |
| "path": "uploaded_control_image_path", | |
| "url": "https://nitish-spz-abtestpredictorv2.hf.space/file=uploaded_control_image_path", | |
| "orig_name": "control.jpg", | |
| "size": 123456, | |
| "mime_type": "image/jpeg", | |
| "meta": { "_type": "gradio.FileData" } | |
| }, | |
| { | |
| "path": "uploaded_variant_image_path", | |
| "url": "https://nitish-spz-abtestpredictorv2.hf.space/file=uploaded_variant_image_path", | |
| "orig_name": "variant.jpg", | |
| "size": 789012, | |
| "mime_type": "image/jpeg", | |
| "meta": { "_type": "gradio.FileData" } | |
| } | |
| ] | |
| } | |
| ``` | |
| **Response Format:** | |
| ```json | |
| { | |
| "predictionResults": { | |
| "probability": "0.041", | |
| "modelConfidence": "75.5%", | |
| "trainingDataSamples": 477, | |
| "totalPredictions": 53, | |
| "correctPredictions": 40, | |
| "totalWinPrediction": 24, | |
| "totalLosePrediction": 29 | |
| }, | |
| "autoDetectedCategories": { | |
| "businessModel": "SaaS", | |
| "customerType": "B2B", | |
| "conversionType": "High-Intent Lead Gen", | |
| "industry": "B2B Software & Tech", | |
| "pageType": "Conversion" | |
| }, | |
| "detectedPattern": { | |
| "pattern": "Double Column Form", | |
| "description": "The variant implements a 'Double Column Form' modification" | |
| }, | |
| "processingInfo": { | |
| "totalProcessingTime": "32.36s", | |
| "aiCategorization": "Perplexity Sonar Reasoning Pro", | |
| "patternDetection": "Gemini Pro Vision", | |
| "confidenceSource": "B2B Software & Tech | Conversion", | |
| "totalPatternsAnalyzed": 359 | |
| } | |
| } | |
| ``` | |
| ### 2. Manual Categorization Prediction | |
| **Endpoint:** `/call/predict_single` | |
| **Method:** POST | |
| **Description:** Predicts A/B test winner with manually provided categories | |
| **Request Format:** | |
| ```json | |
| { | |
| "data": [ | |
| { | |
| "path": "uploaded_control_image_path", | |
| "url": "https://nitish-spz-abtestpredictorv2.hf.space/file=uploaded_control_image_path", | |
| "orig_name": "control.jpg", | |
| "size": 123456, | |
| "mime_type": "image/jpeg", | |
| "meta": { "_type": "gradio.FileData" } | |
| }, | |
| { | |
| "path": "uploaded_variant_image_path", | |
| "url": "https://nitish-spz-abtestpredictorv2.hf.space/file=uploaded_variant_image_path", | |
| "orig_name": "variant.jpg", | |
| "size": 789012, | |
| "mime_type": "image/jpeg", | |
| "meta": { "_type": "gradio.FileData" } | |
| }, | |
| "E-Commerce", | |
| "B2C", | |
| "Direct Purchase", | |
| "Retail & E-commerce", | |
| "Conversion" | |
| ] | |
| } | |
| ``` | |
| **Response Format:** | |
| ```json | |
| { | |
| "probability": "0.987", | |
| "modelConfidence": "82.3%", | |
| "trainingDataSamples": 1205, | |
| "totalPredictions": 120, | |
| "correctPredictions": 98, | |
| "totalWinsPrediction": 67, | |
| "totalLosePrediction": 53 | |
| } | |
| ``` | |
| ## File Upload Process | |
| ### Step 1: Upload Images | |
| **Endpoint:** `/upload` | |
| **Method:** POST | |
| **Content-Type:** multipart/form-data | |
| ```python | |
| import requests | |
| # Upload control image | |
| with open('control.jpg', 'rb') as f: | |
| files = {'files': f} | |
| response = requests.post('https://nitish-spz-abtestpredictorv2.hf.space/upload', files=files) | |
| control_path = response.json()[0] | |
| # Upload variant image | |
| with open('variant.jpg', 'rb') as f: | |
| files = {'files': f} | |
| response = requests.post('https://nitish-spz-abtestpredictorv2.hf.space/upload', files=files) | |
| variant_path = response.json()[0] | |
| ``` | |
| ### Step 2: Make Prediction Request | |
| ```python | |
| import requests | |
| # Prepare FileData objects | |
| control_file_data = { | |
| "path": control_path, | |
| "url": f"https://nitish-spz-abtestpredictorv2.hf.space/file={control_path}", | |
| "orig_name": "control.jpg", | |
| "size": 123456, | |
| "mime_type": "image/jpeg", | |
| "meta": { "_type": "gradio.FileData" } | |
| } | |
| variant_file_data = { | |
| "path": variant_path, | |
| "url": f"https://nitish-spz-abtestpredictorv2.hf.space/file={variant_path}", | |
| "orig_name": "variant.jpg", | |
| "size": 789012, | |
| "mime_type": "image/jpeg", | |
| "meta": { "_type": "gradio.FileData" } | |
| } | |
| # Make prediction request | |
| response = requests.post( | |
| 'https://nitish-spz-abtestpredictorv2.hf.space/call/predict_with_auto_categorization', | |
| json={"data": [control_file_data, variant_file_data]} | |
| ) | |
| result = response.json() | |
| ``` | |
| ## Response Field Descriptions | |
| ### Prediction Results | |
| - **probability**: Float between 0-1 (probability of variant winning). Values > 0.5 mean variant wins, < 0.5 mean control wins | |
| - **modelConfidence**: Percentage confidence based on historical data | |
| - **trainingDataSamples**: Number of training samples used for confidence calculation | |
| - **totalPredictions**: Total number of historical predictions in this category | |
| - **correctPredictions**: Number of correct predictions in historical data | |
| - **totalWinPrediction**: Number of times variant won in historical data | |
| - **totalLosePrediction**: Number of times control won in historical data | |
| ### Auto-Detected Categories | |
| - **businessModel**: "E-Commerce", "SaaS", "Lead Generation", "Other*" | |
| - **customerType**: "B2B", "B2C", "Both", "Other*" | |
| - **conversionType**: "Direct Purchase", "High-Intent Lead Gen", "Info/Content Lead Gen", "Location Search", "Non-Profit/Community", "Other Conversion" | |
| - **industry**: 14 categories including "B2B Software & Tech", "Retail & E-commerce", etc. | |
| - **pageType**: "Awareness & Discovery", "Consideration & Evaluation", "Conversion", "Internal & Navigation", "Post-Conversion & Other" | |
| ### Detected Pattern | |
| - **pattern**: A/B test pattern name (e.g., "Button", "Form Over UI", "Hero Changes") | |
| - **description**: Human-readable description of the pattern | |
| ### Processing Info | |
| - **totalProcessingTime**: Time taken for prediction (typically 20-40 seconds) | |
| - **aiCategorization**: AI service used for categorization | |
| - **patternDetection**: AI service used for pattern detection | |
| - **confidenceSource**: Data source for confidence scores | |
| - **totalPatternsAnalyzed**: Number of patterns in the detection database | |
| ## Error Handling | |
| ### Common Error Responses | |
| ```json | |
| { | |
| "error": "Prediction failed: [error message]", | |
| "modelConfidence": "50.0%", | |
| "trainingDataSamples": 0, | |
| "totalPredictions": 0, | |
| "correctPredictions": 0, | |
| "totalWinPrediction": 0, | |
| "totalLosePrediction": 0 | |
| } | |
| ``` | |
| ### HTTP Status Codes | |
| - **200**: Success | |
| - **400**: Bad request (invalid parameters) | |
| - **500**: Internal server error | |
| - **503**: Service unavailable (GPU quota exceeded) | |
| ## Rate Limits | |
| - Free tier: Limited concurrent requests | |
| - Processing time: 20-40 seconds per prediction | |
| - GPU duration: 50-60 seconds maximum | |
| ## Example Integration (Python) | |
| ```python | |
| import requests | |
| import time | |
| class ABTestPredictor: | |
| def __init__(self): | |
| self.base_url = "https://nitish-spz-abtestpredictorv2.hf.space" | |
| def predict(self, control_image_path, variant_image_path): | |
| # Step 1: Upload images | |
| control_path = self._upload_image(control_image_path) | |
| variant_path = self._upload_image(variant_image_path) | |
| # Step 2: Make prediction | |
| return self._make_prediction(control_path, variant_path) | |
| def _upload_image(self, image_path): | |
| with open(image_path, 'rb') as f: | |
| files = {'files': f} | |
| response = requests.post(f"{self.base_url}/upload", files=files) | |
| return response.json()[0] | |
| def _make_prediction(self, control_path, variant_path): | |
| control_data = self._create_file_data(control_path, "control.jpg") | |
| variant_data = self._create_file_data(variant_path, "variant.jpg") | |
| response = requests.post( | |
| f"{self.base_url}/call/predict_with_auto_categorization", | |
| json={"data": [control_data, variant_data]} | |
| ) | |
| return response.json() | |
| def _create_file_data(self, path, orig_name): | |
| return { | |
| "path": path, | |
| "url": f"{self.base_url}/file={path}", | |
| "orig_name": orig_name, | |
| "size": 0, # Optional | |
| "mime_type": "image/jpeg", | |
| "meta": { "_type": "gradio.FileData" } | |
| } | |
| # Usage | |
| predictor = ABTestPredictor() | |
| result = predictor.predict("control.jpg", "variant.jpg") | |
| # Get prediction results | |
| prob = float(result['predictionResults']['probability']) | |
| winner = "VARIANT WINS" if prob > 0.5 else "CONTROL WINS" | |
| print(f"Winner: {winner}") | |
| print(f"Probability: {prob}") | |
| print(f"Confidence: {result['predictionResults']['modelConfidence']}") | |
| print(f"Accuracy: {result['predictionResults']['correctPredictions']}/{result['predictionResults']['totalPredictions']}") | |
| ``` | |
| ## Notes | |
| - Images are automatically deleted after processing | |
| - Maximum image size: 10MB | |
| - Supported formats: JPEG, PNG, WebP | |
| - Processing time varies based on image complexity and server load | |