# Video Gateway API — v1.1 Base URL mặc định: `http://localhost:18611`. API nhận JSON và tạo video bất đồng bộ. Gateway cần muse2api hoạt động và có tài khoản khả dụng. API không cung cấp đăng nhập muse2api, quản trị tài khoản, chat hoặc tạo ảnh. - Swagger tương tác: `/docs` — nhấn **Authorize**, nhập riêng khóa gateway. - ReDoc: `/redoc`. - OpenAPI: `/openapi.json`. File `openapi.json` trong repo là bản xuất từ app, không sửa tay. - Hướng dẫn này: `/api-guide`. ## Xác thực Các endpoint `/v1/*` yêu cầu: ```http Authorization: Bearer YOUR_GATEWAY_API_KEY ``` Dùng `GATEWAY_API_KEY`, không dùng khóa muse2api. Khóa upstream được cấu hình trên server bằng `UPSTREAM_API_KEY`. Gateway không trả khóa trong API. Tất cả client dùng chung khóa có cùng quyền truy cập tác vụ và media; không có phân quyền theo người dùng. Ví dụ thiết lập biến cho lệnh cURL (nhập khóa của bạn, không commit vào mã nguồn): ```bash export VIDEO_GATEWAY_URL=http://localhost:18611 export GATEWAY_API_KEY='YOUR_GATEWAY_API_KEY' ``` ## Endpoint | Phương thức | Đường dẫn | Thành công | Nội dung | | --- | --- | --- | --- | | GET | `/health` | 200 | Tiến trình gateway; không cần khóa, không kiểm tra upstream | | GET | `/v1/models` | 200 | Model gateway hỗ trợ; không xác nhận còn quota | | POST | `/v1/videos` | 202 | Tạo tác vụ | | GET | `/v1/videos/{task_id}` | 200 | Kiểm tra tiến độ | | GET | `/v1/media/{name}` | 200 | Tải bytes video | Các đường dẫn tương thích `POST /v1/videos/generations` và `GET /v1/videos/generations/{task_id}` có cùng dữ liệu và mã phản hồi với đường dẫn chính. Đây là API JSON của gateway; không hỗ trợ upload multipart hoặc toàn bộ API của OpenAI. ## 1. Xem model ```bash curl --fail-with-body "$VIDEO_GATEWAY_URL/v1/models" \ -H "Authorization: Bearer $GATEWAY_API_KEY" ``` ```json {"object":"list","data":[{"id":"muse-video","object":"model","owned_by":"muse"}]} ``` ## 2. Tạo video ```bash curl --fail-with-body "$VIDEO_GATEWAY_URL/v1/videos" \ -H "Authorization: Bearer $GATEWAY_API_KEY" \ -H 'Content-Type: application/json' \ -d '{"model":"muse-video","prompt":"Một chiếc thuyền trên hồ lúc bình minh","duration":5,"aspect_ratio":"16:9"}' ``` Body JSON: | Trường | Kiểu | Mặc định / giới hạn | | --- | --- | --- | | `prompt` | string, bắt buộc | 1–20000 ký tự | | `model` | string | `muse-video`; dùng model này cho video | | `duration` | integer hoặc null | 1–60 giây; bỏ trống để upstream quyết định | | `size` | string hoặc null | Chuyển tiếp muse2api; ví dụ `16:9` | | `aspect_ratio` | string hoặc null | Ví dụ `16:9`, `9:16` | | `resolution` | string hoặc null | Gợi ý độ phân giải cho upstream | | `timeout` | integer hoặc null | 1–1800 giây; thời gian tạo ở upstream | | `extra` | string hoặc null | Chỉ dẫn bổ sung | | `reference_image` | string hoặc null | URL hoặc data URL ảnh tham chiếu | | `image_url` | string, object hoặc null | URL/data URL hoặc `{"url":"https://…"}` | | `image` | string, object hoặc null | Dạng ảnh tương thích, như `image_url` | Ảnh được chọn theo thứ tự `reference_image` → `image_url` → `image`; chỉ gửi một ảnh để tránh nhầm lẫn. Thời lượng, tỉ lệ và độ phân giải là chỉ dẫn cho upstream, không phải bảo đảm chính xác của model. Tham số ảnh theo định dạng muse2api; gateway không upload tệp từ máy client. Ví dụ ảnh thành video: ```json { "prompt": "Máy quay tiến chậm, lá cây chuyển động nhẹ", "duration": 5, "aspect_ratio": "9:16", "image_url": {"url": "https://example.com/reference.jpg"} } ``` Phản hồi HTTP **202 Accepted** (ID minh họa): ```json {"id":"task_xyz789","task_id":"task_xyz789","status":"queued","progress":10} ``` Lưu ID ngay. HTTP 202 chỉ xác nhận tác vụ được nhận, chưa xác nhận tạo video thành công. Không có endpoint liệt kê, hủy hoặc xóa tác vụ trong gateway. ## 3. Theo dõi tác vụ ```bash curl --fail-with-body "$VIDEO_GATEWAY_URL/v1/videos/task_xyz789" \ -H "Authorization: Bearer $GATEWAY_API_KEY" ``` Đang xử lý: ```json {"id":"task_xyz789","status":"processing","progress":45} ``` Hoàn tất: ```json { "id": "task_xyz789", "status": "completed", "progress": 100, "url": "/v1/media/vid_xyz789.mp4", "video": {"url": "/v1/media/vid_xyz789.mp4"} } ``` Thất bại vẫn trả HTTP **200**, vì việc truy vấn trạng thái thành công: ```json {"id":"task_xyz789","status":"failed","progress":15,"error":"Tạo video thất bại. Kiểm tra tài khoản hoặc nhật ký muse2api."} ``` Poll mỗi 4 giây. Dừng ở `completed` hoặc `failed`. Nếu mất kết nối khi poll, có thể gọi GET lại với cùng ID. Các trạng thái upstream `success`, `succeeded`, `done` được chuẩn hóa thành `completed`. Tác vụ và tệp do upstream lưu, có thể bị xóa tại upstream. ## 4. Tải video Dùng đúng đường dẫn `url` trả về, ghép với base URL gateway: ```bash curl --fail-with-body "$VIDEO_GATEWAY_URL/v1/media/vid_xyz789.mp4" \ -H "Authorization: Bearer $GATEWAY_API_KEY" \ -o video.mp4 ``` Phản hồi là bytes media, thường `Content-Type: video/mp4`. Khóa phải nằm trong header; không có URL tải công khai hoặc khóa trên query string. Trình duyệt không gắn được Bearer key qua `