FairRelay / brain /docs /integration.md
MouleeswaranM's picture
Upload folder using huggingface_hub
fcf8749 verified
|
raw
history blame
7.95 kB
# Fair Dispatch System API Integration Guide
This document describes how external delivery services can integrate with the Fair Dispatch System allocation API.
## Overview
The Fair Dispatch System provides a **single seamless API** for fair route allocation. External systems send drivers and packages as JSON, and receive optimized assignments with fairness metrics.
- **Endpoint**: `POST /api/v1/allocate`
- **Content-Type**: `application/json`
- **Authentication**: None required for demo (configure for production)
---
## Request Schema: AllocationRequest
```json
{
"allocation_date": "2026-02-10",
"warehouse": {
"lat": 12.9716,
"lng": 77.5946
},
"drivers": [
{
"id": "external_driver_001",
"name": "Raju",
"preferred_language": "en",
"vehicle_capacity_kg": 150
}
],
"packages": [
{
"id": "external_pkg_001",
"weight_kg": 2.5,
"fragility_level": 3,
"address": "Some street, Area, City",
"latitude": 12.97,
"longitude": 77.6,
"priority": "NORMAL"
}
]
}
```
### Field Descriptions
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `allocation_date` | string (date) | Yes | Date for the allocation (YYYY-MM-DD) |
| `warehouse.lat` | float | Yes | Warehouse latitude |
| `warehouse.lng` | float | Yes | Warehouse longitude |
| `drivers` | array | Yes | At least 1 driver required |
| `drivers[].id` | string | Yes | External driver ID |
| `drivers[].name` | string | Yes | Driver name |
| `drivers[].vehicle_capacity_kg` | float | No | Vehicle capacity (default: 100) |
| `drivers[].preferred_language` | string | No | Language: en, ta, hi, te, kn (default: en) |
| `packages` | array | Yes | At least 1 package required |
| `packages[].id` | string | Yes | External package ID |
| `packages[].weight_kg` | float | Yes | Package weight (min: 0.01) |
| `packages[].fragility_level` | int | No | Fragility 1-5 (default: 1) |
| `packages[].address` | string | Yes | Delivery address |
| `packages[].latitude` | float | Yes | Delivery latitude |
| `packages[].longitude` | float | Yes | Delivery longitude |
| `packages[].priority` | string | No | NORMAL, HIGH, or EXPRESS (default: NORMAL) |
---
## Response Schema: AllocationResponse
```json
{
"allocation_run_id": "550e8400-e29b-41d4-a716-446655440000",
"allocation_date": "2026-02-10",
"global_fairness": {
"avg_workload": 63.2,
"std_dev": 18.4,
"gini_index": 0.29
},
"assignments": [
{
"driver_id": "550e8400-e29b-41d4-a716-446655440001",
"driver_external_id": "external_driver_001",
"driver_name": "Raju",
"route_id": "550e8400-e29b-41d4-a716-446655440002",
"workload_score": 65.3,
"fairness_score": 0.82,
"route_summary": {
"num_packages": 22,
"total_weight_kg": 48.5,
"num_stops": 14,
"route_difficulty_score": 2.1,
"estimated_time_minutes": 145
},
"explanation": "You received a moderate route..."
}
]
}
```
### Global Fairness Metrics
| Metric | Description |
|--------|-------------|
| `avg_workload` | Average workload score across all drivers |
| `std_dev` | Standard deviation of workload (lower = fairer) |
| `gini_index` | Gini coefficient 0-1 (lower = fairer distribution) |
---
## cURL Examples
### Minimal Example (2 drivers, 2 packages)
```bash
curl -X POST "http://localhost:8000/api/v1/allocate" \
-H "Content-Type: application/json" \
-d '{
"allocation_date": "2026-02-10",
"warehouse": { "lat": 12.9716, "lng": 77.5946 },
"drivers": [
{"id": "driver_001", "name": "Raju", "vehicle_capacity_kg": 150, "preferred_language": "en"},
{"id": "driver_002", "name": "Priya", "vehicle_capacity_kg": 120, "preferred_language": "ta"}
],
"packages": [
{"id": "pkg_001", "weight_kg": 2.5, "fragility_level": 3, "address": "4A Ruby Apartment", "latitude": 12.97, "longitude": 77.60, "priority": "NORMAL"},
{"id": "pkg_002", "weight_kg": 8.0, "fragility_level": 2, "address": "No. 12 Oak Street", "latitude": 12.98, "longitude": 77.61, "priority": "HIGH"}
]
}'
```
### Full Example (5 drivers, 10 packages)
```bash
curl -X POST "http://localhost:8000/api/v1/allocate" \
-H "Content-Type: application/json" \
-d '{
"allocation_date": "2026-02-10",
"warehouse": { "lat": 12.9716, "lng": 77.5946 },
"drivers": [
{"id": "drv_001", "name": "Raju", "vehicle_capacity_kg": 150, "preferred_language": "en"},
{"id": "drv_002", "name": "Priya", "vehicle_capacity_kg": 120, "preferred_language": "ta"},
{"id": "drv_003", "name": "Kumar", "vehicle_capacity_kg": 180, "preferred_language": "en"},
{"id": "drv_004", "name": "Lakshmi", "vehicle_capacity_kg": 100, "preferred_language": "hi"},
{"id": "drv_005", "name": "Arjun", "vehicle_capacity_kg": 160, "preferred_language": "te"}
],
"packages": [
{"id": "pkg_001", "weight_kg": 2.5, "fragility_level": 3, "address": "Koramangala 3rd Main", "latitude": 12.9352, "longitude": 77.6245, "priority": "NORMAL"},
{"id": "pkg_002", "weight_kg": 8.0, "fragility_level": 2, "address": "Indiranagar 2nd Cross", "latitude": 12.9716, "longitude": 77.6411, "priority": "HIGH"},
{"id": "pkg_003", "weight_kg": 1.5, "fragility_level": 1, "address": "Brigade Road", "latitude": 12.9719, "longitude": 77.6074, "priority": "NORMAL"},
{"id": "pkg_004", "weight_kg": 5.0, "fragility_level": 4, "address": "MG Road", "latitude": 12.9756, "longitude": 77.6066, "priority": "EXPRESS"},
{"id": "pkg_005", "weight_kg": 3.2, "fragility_level": 2, "address": "Residency Road", "latitude": 12.9682, "longitude": 77.5973, "priority": "NORMAL"},
{"id": "pkg_006", "weight_kg": 6.8, "fragility_level": 3, "address": "Commercial Street", "latitude": 12.9833, "longitude": 77.6072, "priority": "HIGH"},
{"id": "pkg_007", "weight_kg": 2.1, "fragility_level": 1, "address": "Cunningham Road", "latitude": 12.9927, "longitude": 77.5855, "priority": "NORMAL"},
{"id": "pkg_008", "weight_kg": 4.5, "fragility_level": 5, "address": "Lavelle Road", "latitude": 12.9644, "longitude": 77.5957, "priority": "EXPRESS"},
{"id": "pkg_009", "weight_kg": 7.2, "fragility_level": 2, "address": "Vittal Mallya Road", "latitude": 12.9738, "longitude": 77.5956, "priority": "NORMAL"},
{"id": "pkg_010", "weight_kg": 1.8, "fragility_level": 1, "address": "Infantry Road", "latitude": 12.9864, "longitude": 77.5961, "priority": "HIGH"}
]
}'
```
---
## Demo Page
A visual demo page is available at:
```
http://localhost:8000/demo/allocate
```
Features:
- JSON input editor with pre-filled example
- One-click allocation execution
- Real-time metrics display (Gini, StdDev, Avg Workload)
- Response JSON viewer
- Copy-paste cURL examples
---
## Notes for External Integrators
1. **Driver IDs**: Use your own external IDs. The system tracks them via `driver_external_id` in responses.
2. **Package IDs**: Similarly, package IDs map to your system.
3. **Learning Agent**: The system internally uses historical data from previous allocations to improve fairness. This is DB-backed and doesn't require extra input fields.
4. **Idempotency**: Each allocation creates a new `allocation_run_id`. Re-running with the same data creates a new run.
5. **Error Handling**: On validation errors, you'll receive HTTP 400 with a `detail` field explaining the issue.
---
## API Endpoints Reference
| Method | Endpoint | Description |
|--------|----------|-------------|
| POST | `/api/v1/allocate` | Main allocation endpoint |
| POST | `/api/v1/allocate/langgraph` | LangGraph-based allocation (same interface) |
| GET | `/api/v1/drivers/{id}` | Get driver details |
| GET | `/api/v1/routes/{id}` | Get route details |
| POST | `/api/v1/feedback` | Submit driver feedback |
| GET | `/demo/allocate` | Visual demo page |
| GET | `/health` | Health check |