diff --git a/API_REFERENCE.md b/API_REFERENCE.md index 9dd5287..95190b1 100644 --- a/API_REFERENCE.md +++ b/API_REFERENCE.md @@ -269,12 +269,14 @@ Get status and progress of a simulation job. | `total_duration_seconds` | float | Total execution time in seconds | | `error` | string | Error message if job failed | | `details` | array[object] | Per model-day execution details | +| `warnings` | array[string] | Optional array of non-fatal warning messages | **Job Status Values:** | Status | Description | |--------|-------------| | `pending` | Job created, waiting to start | +| `downloading_data` | Preparing price data (downloading if needed) | | `running` | Job currently executing | | `completed` | All model-days completed successfully | | `partial` | Some model-days completed, some failed | @@ -289,6 +291,35 @@ Get status and progress of a simulation job. | `completed` | Finished successfully | | `failed` | Execution failed (see `error` field) | +**Warnings Field:** + +The optional `warnings` array contains non-fatal warning messages about the job execution: + +- **Rate limit warnings**: Price data download hit API rate limits +- **Skipped dates**: Some dates couldn't be processed due to incomplete price data +- **Other issues**: Non-fatal problems that don't prevent job completion + +**Example response with warnings:** + +```json +{ + "job_id": "019a426b-1234-5678-90ab-cdef12345678", + "status": "completed", + "progress": { + "total_model_days": 10, + "completed": 8, + "failed": 0, + "pending": 0 + }, + "warnings": [ + "Rate limit reached - downloaded 12/15 symbols", + "Skipped 2 dates due to incomplete price data: ['2025-10-02', '2025-10-05']" + ] +} +``` + +If no warnings occurred, the field will be `null` or omitted. + **Error Response:** **404 Not Found** - Job doesn't exist diff --git a/docs/user-guide/using-the-api.md b/docs/user-guide/using-the-api.md index f3e4d2f..8bcf4d5 100644 --- a/docs/user-guide/using-the-api.md +++ b/docs/user-guide/using-the-api.md @@ -94,6 +94,70 @@ curl "http://localhost:8080/results?job_id=$JOB_ID&date=2025-01-16&model=gpt-4" --- +## Async Data Download + +The `/simulate/trigger` endpoint responds immediately (<1 second), even when price data needs to be downloaded. + +### Flow + +1. **POST /simulate/trigger** - Returns `job_id` immediately +2. **Background worker** - Downloads missing data automatically +3. **Poll /simulate/status** - Track progress through status transitions + +### Status Progression + +``` +pending → downloading_data → running → completed +``` + +### Monitoring Progress + +Use `docker logs -f` to monitor download progress in real-time: + +```bash +docker logs -f ai-trader-server + +# Example output: +# Job 019a426b: Checking price data availability... +# Job 019a426b: Missing data for 15 symbols +# Job 019a426b: Starting prioritized download... +# Job 019a426b: Download complete - 12/15 symbols succeeded +# Job 019a426b: Rate limit reached - proceeding with available dates +# Job 019a426b: Starting execution - 8 dates, 1 models +``` + +### Handling Warnings + +Check the `warnings` field in status response: + +```python +import requests +import time + +# Trigger simulation +response = requests.post("http://localhost:8080/simulate/trigger", json={ + "start_date": "2025-10-01", + "end_date": "2025-10-10", + "models": ["gpt-5"] +}) + +job_id = response.json()["job_id"] + +# Poll until complete +while True: + status = requests.get(f"http://localhost:8080/simulate/status/{job_id}").json() + + if status["status"] in ["completed", "partial", "failed"]: + # Check for warnings + if status.get("warnings"): + print("Warnings:", status["warnings"]) + break + + time.sleep(2) +``` + +--- + ## Best Practices ### 1. Check Health Before Triggering