multilingual-absa / docs /API_DOCUMENTATION.md
Aryan Mishra
Deploy Gradio app to HF Spaces
2617189
|
Raw
History Blame
4.98 kB
# API Documentation — Multilingual ABSA
> ⚠️ The REST API has been removed. The app is now a single Gradio interface. This doc is kept for historical reference only.
## Base URL
- Local development: `http://localhost:8000`
- Production: `https://your-railway-app.up.railway.app`
## Authentication
Currently **none**. All endpoints are publicly accessible.
## Endpoints
### POST /predict
Analyze a single review for aspect-based sentiment.
**Request Body:**
```json
{
"text": "The food was great but the service was terrible.",
"language": "en"
}
```
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `text` | string | Yes | Review text to analyze |
| `language` | string | No | Force language (`"en"`, `"hi"`, `"hinglish"`). Auto-detected if omitted |
**Response `200`:**
```json
{
"text": "The food was great but the service was terrible.",
"language": "en",
"detected_language": "en",
"aspects": [
{
"aspect": "Food",
"sentiment": "positive",
"confidence": 0.85,
"start": 4,
"end": 8
},
{
"aspect": "Service",
"sentiment": "negative",
"confidence": 0.82,
"start": 27,
"end": 34
}
],
"processing_time_ms": 185.3
}
```
| Field | Type | Description |
|-------|------|-------------|
| `text` | string | Original input text |
| `language` | string | Language used (detected or forced) |
| `detected_language` | string | Auto-detected language code |
| `aspects` | array | List of extracted aspect-sentiment pairs |
| `processing_time_ms` | float | Total inference time in milliseconds |
**Aspect Object:**
| Field | Type | Description |
|-------|------|-------------|
| `aspect` | string | Extracted aspect term (title-cased) |
| `sentiment` | string | `"positive"`, `"negative"`, `"neutral"`, or `"conflict"` |
| `confidence` | float | Confidence score (0.0–1.0) |
| `start` | int | Character offset start in original text |
| `end` | int | Character offset end in original text |
**Error Responses:**
| Status | Condition |
|--------|-----------|
| 422 | Empty text, missing `text` field |
| 500 | Model inference failure |
---
### POST /batch
Upload a CSV file for batch analysis. Processed asynchronously via Celery.
**Request:** `multipart/form-data`
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `file` | file | Yes | CSV file with a `text` column (max 10,000 rows) |
**Response `200`:**
```json
{
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "queued",
"total_reviews": 4250,
"processed": 0,
"result_url": null
}
```
**Error Responses:**
| Status | Condition |
|--------|-----------|
| 422 | Non-CSV file, missing `text` column, >10K rows |
| 500 | Batch processing failed |
---
### GET /status/{job_id}
Poll batch job progress.
**Response `200` (processing):**
```json
{
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "processing",
"total_reviews": 4250,
"processed": 1200,
"result_url": null
}
```
**Response `200` (completed):**
```json
{
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "completed",
"total_reviews": 4250,
"processed": 4250,
"result_url": "/results/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
```
**Error Responses:**
| Status | Condition |
|--------|-----------|
| 404 | Job ID not found |
---
### GET /health
System health check.
**Response `200`:**
```json
{
"status": "ok",
"model": "loaded",
"db": "connected"
}
```
---
### GET /info
Get model metadata.
**Response `200`:**
```json
{
"model_name": "xlm-roberta-base-absa",
"version": "1.0",
"supported_languages": "en, hi",
"max_batch_size": "10000"
}
```
---
### GET /metrics
Prometheus metrics endpoint (auto-instrumented).
**Response `200`:** Prometheus text format metrics.
Available metrics:
- `fastapi_requests_total` (counter by method, path, status)
- `fastapi_requests_duration_seconds` (histogram)
- `fastapi_requests_inprogress` (gauge)
- Custom ABSA metrics (if implemented)
---
## Example Usage
### cURL
```bash
# Single prediction
curl -X POST http://localhost:8000/predict \
-H "Content-Type: application/json" \
-d '{"text": "This phone has amazing battery life but the camera is disappointing", "language": "en"}'
# Health check
curl http://localhost:8000/health
# Model info
curl http://localhost:8000/info
```
### Python
```python
import httpx
response = httpx.post(
"http://localhost:8000/predict",
json={"text": "This phone has amazing battery life but the camera is disappointing"}
)
print(response.json())
```
### JavaScript
```javascript
const response = await fetch('http://localhost:8000/predict', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
text: 'This phone has amazing battery life but the camera is disappointing'
})
});
const data = await response.json();
console.log(data);
```