chatgpt-oasis / hf_client.py
parthraninga's picture
Upload 10 files
95efa57 verified
#!/usr/bin/env python3
"""
Client for testing the ChatGPT Oasis Model Inference API deployed on Hugging Face Spaces
"""
import requests
import base64
import json
from PIL import Image
import io
import os
import time
class HuggingFaceSpacesClient:
def __init__(self, space_url):
"""
Initialize the client with your Hugging Face Space URL
Args:
space_url (str): Your Space URL (e.g., "https://your-username-chatgpt-oasis.hf.space")
"""
self.base_url = space_url.rstrip('/')
def health_check(self):
"""Check if the API is healthy and models are loaded"""
try:
response = requests.get(f"{self.base_url}/health", timeout=30)
print(f"Health Check Status: {response.status_code}")
print(f"Response: {json.dumps(response.json(), indent=2)}")
return response.status_code == 200
except Exception as e:
print(f"Health check error: {e}")
return False
def list_models(self):
"""Get information about available models"""
try:
response = requests.get(f"{self.base_url}/models", timeout=30)
print(f"Models Status: {response.status_code}")
print(f"Available Models: {json.dumps(response.json(), indent=2)}")
return response.json()
except Exception as e:
print(f"Models list error: {e}")
return None
def predict_file_upload(self, image_path, model_name="oasis500m"):
"""
Predict using file upload
Args:
image_path (str): Path to the image file
model_name (str): Model to use ("oasis500m" or "vit-l-20")
"""
if not os.path.exists(image_path):
print(f"Image file not found: {image_path}")
return None
try:
with open(image_path, 'rb') as f:
files = {'file': (os.path.basename(image_path), f, 'image/jpeg')}
data = {'model_name': model_name}
print(f"Uploading {image_path} to {model_name}...")
response = requests.post(
f"{self.base_url}/upload_inference",
files=files,
data=data,
timeout=120
)
print(f"Status: {response.status_code}")
if response.status_code == 200:
result = response.json()
print(f"Model used: {result['model_used']}")
print("Top 3 predictions:")
for i, pred in enumerate(result['predictions'][:3]):
print(f" {i+1}. {pred['label']} ({pred['confidence']:.3f})")
return result
else:
print(f"Error: {response.text}")
return None
except Exception as e:
print(f"File upload prediction error: {e}")
return None
def predict_base64(self, image_path, model_name="oasis500m"):
"""
Predict using base64 encoded image
Args:
image_path (str): Path to the image file
model_name (str): Model to use ("oasis500m" or "vit-l-20")
"""
if not os.path.exists(image_path):
print(f"Image file not found: {image_path}")
return None
try:
# Load and encode image
image = Image.open(image_path)
buffer = io.BytesIO()
image.save(buffer, format="JPEG")
image_base64 = base64.b64encode(buffer.getvalue()).decode()
print(f"Encoding {image_path} and sending to {model_name}...")
response = requests.post(
f"{self.base_url}/inference",
json={
"image": image_base64,
"model_name": model_name
},
headers={"Content-Type": "application/json"},
timeout=120
)
print(f"Status: {response.status_code}")
if response.status_code == 200:
result = response.json()
print(f"Model used: {result['model_used']}")
print("Top 3 predictions:")
for i, pred in enumerate(result['predictions'][:3]):
print(f" {i+1}. {pred['label']} ({pred['confidence']:.3f})")
return result
else:
print(f"Error: {response.text}")
return None
except Exception as e:
print(f"Base64 prediction error: {e}")
return None
def create_test_image(self, output_path="test_image.jpg"):
"""Create a simple test image for testing"""
# Create a simple colored rectangle
img = Image.new('RGB', (224, 224), color='red')
img.save(output_path, format='JPEG')
print(f"Test image created: {output_path}")
return output_path
def test_all_endpoints(self, image_path=None):
"""Test all endpoints with a given image or create a test image"""
print("=" * 60)
print("ChatGPT Oasis Model Inference API - Hugging Face Spaces Test")
print("=" * 60)
# Test health check
print("\n1. Testing health check...")
if not self.health_check():
print("❌ Health check failed. Make sure your Space is running!")
return
# Test models list
print("\n2. Testing models list...")
self.list_models()
# Use provided image or create test image
if image_path is None:
print("\n3. Creating test image...")
image_path = self.create_test_image()
else:
print(f"\n3. Using provided image: {image_path}")
# Test both models with file upload
print("\n4. Testing file upload inference...")
for model_name in ["oasis500m", "vit-l-20"]:
print(f"\n--- Testing {model_name} with file upload ---")
self.predict_file_upload(image_path, model_name)
time.sleep(2) # Small delay between requests
# Test both models with base64
print("\n5. Testing base64 inference...")
for model_name in ["oasis500m", "vit-l-20"]:
print(f"\n--- Testing {model_name} with base64 ---")
self.predict_base64(image_path, model_name)
time.sleep(2) # Small delay between requests
print("\n" + "=" * 60)
print("βœ… Test completed!")
def main():
"""Main function to run the test client"""
# Replace with your actual Hugging Face Space URL
SPACE_URL = "https://your-username-chatgpt-oasis.hf.space"
# Initialize client
client = HuggingFaceSpacesClient(SPACE_URL)
# Test with a specific image if provided
test_image = None # Change this to a path like "your_image.jpg" if you have one
# Run all tests
client.test_all_endpoints(test_image)
if __name__ == "__main__":
main()