Hunyuan3D-2.1 / API_README.md
asimfayaz's picture
Receive data in multipart/form-data instead of base64
bb5d3f0
# Hunyuan3D-2.1 API Documentation
This document describes the REST API endpoints for the Hunyuan3D-2.1 service.
## Base URL
For the deployed Hugging Face Space:
```
https://asimfayaz-hunyuan3d-2-1.hf.space
```
For local development:
```
http://localhost:7860
```
## Endpoints
### 1. Health Check
**GET** `/api/health`
Check if the service is running.
**Response:**
```json
{
"status": "ok",
"version": "2.1"
}
```
### 2. Generate 3D Model
**POST** `/api/generate`
Start a 3D model generation job.
**Request Format:**
Multipart/form-data with the following fields:
- `front`: (Required) Front view image file
- `back`: (Optional) Back view image file
- `left`: (Optional) Left view image file
- `right`: (Optional) Right view image file
- `options`: (Optional) JSON string with generation options
**Options JSON Format:**
```json
{
"enable_pbr": true,
"should_remesh": true,
"should_texture": true
}
```
**Response:**
```json
{
"job_id": "uuid",
"status": "queued"
}
```
**Notes:**
- The `front` image is mandatory
- Images should be uploaded as files in multipart/form-data format
- The `options` field is optional and will use defaults if not provided
- **Texture generation is enabled by default for high-quality 3D models**
### 3. Check Job Status
**GET** `/api/status?job_id=uuid`
Check the status of a generation job.
**Response:**
```json
{
"status": "completed|processing|queued|failed",
"progress": 0-100,
"stage": "current_processing_stage",
"model_urls": {
"glb": "url_to_glb_file"
}
}
```
**Status Values:**
- `queued`: Job is waiting to be processed
- `processing`: Job is currently being processed
- `completed`: Job completed successfully
- `failed`: Job failed with an error
**Stage Values:**
- `queued`: Job is waiting to be processed
- `initializing`: Setting up job and converting images
- `preprocessing`: Preparing images and options
- `shape_generation`: Generating 3D mesh from images
- `face_reduction`: Optimizing mesh geometry
- `texture_generation`: Creating textures for the 3D model
- `completed`: Job finished successfully
- `failed`: Job failed with an error
## Usage Examples
### Python Example
```python
import requests
import json
import time
# Prepare files and options
files = {
'front': ('front.png', open('front.png', 'rb'), 'image/png'),
# Optional additional views
# 'back': ('back.png', open('back.png', 'rb'), 'image/png'),
# 'left': ('left.png', open('left.png', 'rb'), 'image/png'),
# 'right': ('right.png', open('right.png', 'rb'), 'image/png'),
}
options = {
"enable_pbr": True,
"should_texture": True, # Critical for 3D model quality
"should_remesh": True
}
# Start generation
response = requests.post(
"http://localhost:7860/api/generate",
files=files,
data={'options': json.dumps(options)}
)
job_id = response.json()["job_id"]
# Check status
while True:
status_response = requests.get(f"http://localhost:7860/api/status?job_id={job_id}")
data = status_response.json()
if data["status"] == "completed":
print(f"Model ready: {data['model_urls']['glb']}")
break
elif data["status"] == "failed":
print(f"Generation failed: {data.get('error')}")
break
print(f"Progress: {data['progress']}% - Stage: {data['stage']}")
time.sleep(5)
```
### cURL Example
```bash
# Health check
curl http://localhost:7860/api/health
# Generate model
curl -X POST http://localhost:7860/api/generate \
-F "[email protected]" \
-F 'options={"enable_pbr":true,"should_texture":true}'
# Check status
curl "http://localhost:7860/api/status?job_id=your_job_id"
```
## Error Handling
The API returns appropriate HTTP status codes:
- `200`: Success
- `400`: Bad request (invalid input)
- `404`: Job not found
- `500`: Internal server error
Error responses include a detail message:
```json
{
"detail": "Error message here"
}
```
## Testing
Use the provided test script to verify the API:
```bash
python test_api.py
```
This will test all endpoints using the demo image.
## Notes
- Jobs are processed asynchronously in the background
- The service maintains job state in memory (jobs are lost on restart)
- Generated models are served via static file URLs
- The texture generation step is optional and can be disabled via options