AHV AI Orchestrator
Dịch vụ API xử lý các tác vụ AI nặng — đổi mặt, nâng cấp ảnh, tạo ảnh/video, nhạc, giọng nói, thử đồ ảo… — theo cơ chế job bất đồng bộ: bạn gửi yêu cầu, nhận ngay job_id, rồi nhận kết quả qua webhook hoặc polling.
Kiến trúc (mức khái niệm)
- Bất đồng bộ:
POST /v1/jobstrả về ngay; việc nặng chạy nền, bạn không phải giữ kết nối. - Điều phối tự động: orchestrator xếp hàng đợi và chọn tài nguyên xử lý phù hợp trong cụm GPU. Phía khách không cần (và không thể) chọn máy xử lý.
- Ước tính thời gian: mỗi job trả về
predict_time(giây) vàeta_utc— chỉ là ước tính tham khảo, không phải cam kết. - Kiểm duyệt nội dung: nội dung đầu vào có thể được hệ thống kiểm duyệt tự động; nội dung vi phạm bị từ chối (
rejected).
Tương thích ngược: tính năng mới được bổ sung dưới dạng tham số tuỳ chọn. Gọi theo cách cũ (không gửi tham số mới) vẫn cho kết quả như trước.
Bắt đầu nhanh
Mọi API công khai nằm dưới https://ai.ahvchat.com. Ba bước để chạy job đầu tiên:
1. Tạo job
curl -X POST https://ai.ahvchat.com/v1/jobs \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{
"task": "faceswap",
"payload": {
"target_url": "https://example.com/photo.jpg",
"source_url": "https://example.com/face.jpg"
},
"webhook_url": "https://your-server.com/webhook"
}'
Phản hồi:
{
"job_id": "JOB_ID",
"status": "queued",
"predict_time": 10,
"eta_utc": "2026-11-11T10:00:10Z"
}
2. Nhận kết quả
Có hai cách (dùng một hoặc cả hai): chờ webhook gửi tới webhook_url, hoặc hỏi trạng thái job bằng polling:
curl https://ai.ahvchat.com/v1/jobs/JOB_ID \
-H "X-API-Key: YOUR_API_KEY"
3. Tải kết quả về
Khi status là succeeded, lấy result.url và tải tệp về lưu ở hệ thống của bạn — liên kết kết quả chỉ tồn tại tạm thời (xem Khuyến nghị tích hợp).
Xác thực
Các API tạo/đọc job và kiểm duyệt ảnh yêu cầu header:
X-API-Key: YOUR_API_KEY
- Khoá API do AHV cấp. Cần khoá API hoặc hỗ trợ tích hợp? Xem mục Liên hệ ở trang chủ.
- Decide API dùng một khoá riêng (xem Decide API).
- Thiếu hoặc sai khoá ⇒ HTTP
401. - Chỉ dùng khoá ở máy chủ của bạn. Không nhúng khoá vào app di động, trang web hay mã nguồn công khai. Nếu nghi ngờ khoá bị lộ, hãy liên hệ AHV để thu hồi và cấp khoá mới.
Trong tài liệu này, YOUR_API_KEY chỉ là chỗ giữ chỗ — hãy thay bằng khoá của bạn.
Vòng đời job & trạng thái
| Trạng thái | Ý nghĩa | Cuối cùng? |
|---|---|---|
queued | Đã nhận, đang chờ trong hàng đợi. | Không |
running | Đang xử lý. progress tăng từ 0 đến 100. | Không |
succeeded | Hoàn thành; có result.url. | Có |
failed | Lỗi kỹ thuật hoặc quá thời gian xử lý; có error. | Có |
rejected | Bị từ chối do nội dung vi phạm (NSFW_BLOCKED). | Có |
Luồng xử lý
- Client gửi
POST /v1/jobsvớitask,payloadvà (tuỳ chọn)webhook_url. - Job được ghi nhận ở trạng thái
queued; phản hồi cójob_id,predict_time,eta_utc. - Webhook giai đoạn 1: sự kiện
job.queued. - Hệ thống nhận job từ hàng đợi và giao cho tài nguyên xử lý phù hợp; webhook giai đoạn 2:
job.started. - Xử lý xong, hệ thống lưu kết quả; webhook giai đoạn 3:
job.finishedkèmresulthoặcerror.
Job không lưu vĩnh viễn. Thông tin job và tệp kết quả chỉ được giữ trong một khoảng thời gian giới hạn rồi bị xoá tự động. Hãy lưu kết quả cần thiết ngay khi job hoàn tất.
API: Tạo & theo dõi job
POST /v1/jobs — Tạo job
| Trường | Bắt buộc | Mô tả |
|---|---|---|
task | Có | Loại tính năng, ví dụ faceswap, try_on, ahv_image. Xem danh sách tính năng. |
payload | Có | Tham số riêng của từng task (xem các mục Tính năng). |
webhook_url | Không | URL HTTPS nhận kết quả. Bỏ trống nếu bạn dùng polling. |
Ví dụ gọi: xem Bắt đầu nhanh. Phản hồi thành công gồm job_id, status (queued), predict_time, eta_utc.
GET /v1/jobs/{job_id} — Xem trạng thái
Khi thành công
{
"job_id": "JOB_ID",
"task": "faceswap",
"status": "succeeded",
"progress": 100,
"result": {
"url": "https://...",
"filename": "result.jpg",
"meta": {"width": 1080, "height": 1920}
},
"duration_sec": 3.5
}
Khi lỗi
{
"job_id": "JOB_ID",
"status": "failed",
"error": {"code": 502, "message": "Processing timeout"}
}
result.meta chứa thông tin bổ sung tuỳ task (kích thước, thời lượng…). Chỉ nên dựa vào các trường đã được mô tả trong API Docs; các trường khác có thể thay đổi.
Chi tiết payload từng task: xem API Docs, mục 1.
API: Upload & kiểm duyệt ảnh
POST /upload — Upload tệp
Dùng khi ảnh/âm thanh của bạn chưa có URL công khai (hoặc nguồn chặn tải trực tiếp). Gửi tệp bằng multipart/form-data, nhận lại URL để dùng làm đầu vào cho job.
curl -X POST https://ai.ahvchat.com/upload -F "file=@photo.jpg"
{"url": "https://...", "filename": "..."}
Tệp upload chỉ lưu tạm; hãy tạo job ngay sau khi upload.
POST /v1/nsfw-check — Kiểm duyệt ảnh
Kiểm tra nhanh một ảnh có nội dung 18+ hay không. Gửi image_url (hoặc tệp ảnh) kèm mức strict:
| strict | Mô tả |
|---|---|
low | Mặc định. |
medium | Nhạy hơn mức mặc định. |
high | Nhạy nhất. |
Kết quả gồm cờ is_nsfw và nhãn (safe/nsfw). Cần header X-API-Key. Định dạng chi tiết: xem API Docs.
Webhook
Nếu job có webhook_url, hệ thống gửi POST JSON tới URL đó ở 3 thời điểm:
| Thời điểm | event | status |
|---|---|---|
| Job được nhận | job.queued | queued |
| Bắt đầu xử lý | job.started | running |
| Xử lý xong | job.finished | succeeded / failed / rejected |
Payload khi thành công
{
"event": "job.finished",
"event_id": "...",
"job_id": "JOB_ID",
"task": "faceswap",
"status": "succeeded",
"ok": true,
"progress": 100,
"duration": 3.5,
"predict_time": 10,
"result": {
"ok": true,
"status": "succeeded",
"url": "https://...",
"filename": "result.jpg",
"meta": {"width": 1080, "height": 1920}
},
"error": null
}
Payload khi lỗi / bị từ chối
{
"event": "job.finished",
"job_id": "JOB_ID",
"status": "failed",
"ok": false,
"error": {"code": 502, "message": "Processing timeout"}
}
{
"event": "job.finished",
"job_id": "JOB_ID",
"status": "rejected",
"ok": false,
"error": {"code": "NSFW_BLOCKED", "message": "Content violates policy"}
}
Phía máy chủ của bạn nên
- Trả HTTP 2xx nhanh (xử lý nặng thì đưa vào hàng đợi của bạn). Nếu không nhận được 2xx, sự kiện có thể được gửi lại.
- Chống trùng: cùng một sự kiện có thể được gửi nhiều hơn một lần. Dùng
job_id+event(hoặcevent_id) để bỏ qua bản trùng. - Đối chiếu trước khi hành động quan trọng (cộng tiền, giao hàng…): gọi
GET /v1/jobs/{job_id}để xác nhận trạng thái thật thay vì chỉ tin nội dung request. - Giữ kín
webhook_url(dùng HTTPS, đừng ghi vào log công khai) và chỉ nhận phương thứcPOST. URL không phải cơ chế xác thực — hãy dựa vào bước đối chiếu ở trên. - Luôn có phương án dự phòng: nếu không nhận được webhook, dùng polling theo
job_id.
API: Decide (quyết định có kiểu)
Gửi một nội dung (state) kèm vài câu hỏi có kiểu → nhận đáp án có cấu trúc kèm xác suất. API đồng bộ (trả kết quả ngay trong response, không tạo job) và tương thích với các client Decide chuẩn: chỉ cần đổi base_url (chi tiết tương thích xem API Docs).
| Endpoint | Mô tả |
|---|---|
POST /decide/v1/systemone | Đặt 1–32 câu hỏi cho một state (tối đa 2.048 token). |
GET /decide/v1/models | Danh sách tên model có thể dùng. |
- Base URL cho client tương thích:
https://ai.ahvchat.com/decide - Xác thực: header
Authorization: Bearer YOUR_API_KEYhoặcX-API-Key: YOUR_API_KEY. Đây là khoá riêng của Decide API, không phải khoá dùng cho/v1/jobs. - 3 kiểu câu hỏi:
noul(có/không → xác suất),choice(chọn 1 nhãn trong 2–255 nhãn),score(thang 2–10 mức). Các trường mở rộng của AHV (ví dụwarnings): xem API Docs. - Mã lỗi:
401sai/thiếu khoá,429gọi quá nhanh,503dịch vụ tạm thời không khả dụng (thử lại sau).
curl -s https://ai.ahvchat.com/decide/v1/systemone \
-H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"jev-latest","state":"Mình đã thanh toán nhưng chưa thấy đơn hàng được xác nhận!",
"questions":{"gap":{"type":"score","instructions":"Mức gấp?",
"criteria":["không gấp","sớm","khẩn cấp"]}}}'
Tài liệu đầy đủ: API Docs, mục 10; thử trực tiếp ở tab Decide trên API Demo.
Danh sách tính năng (task)
Giá trị task gửi trong POST /v1/jobs. Cột “Chi tiết” dẫn tới mục tương ứng trong API Docs.
| Task | Ý nghĩa | Đầu vào chính | Chi tiết |
|---|---|---|---|
faceswap | Đổi mặt trên ảnh | target_url, source_url | API Docs |
faceswap_multi | Đổi nhiều khuôn mặt trong một ảnh | target_url, source_urls[] | API Docs |
faceswap_video | Đổi mặt trong video, giữ nguyên âm thanh | target_url, source_url | API Docs |
upscale | Nâng cấp, làm nét và làm đẹp ảnh bằng AI | image_url | API Docs |
ahv_image | Tạo ảnh từ mô tả (text-to-image) hoặc biến đổi ảnh (image-to-image) | prompt | API Docs |
gg_image, cx_image | Tạo ảnh từ mô tả bằng các engine bổ sung | prompt | GG · CX |
ahv_video | Tạo video (có tiếng) từ mô tả, tuỳ chọn kèm ảnh nguồn | prompt | API Docs |
talking_video | Ảnh chân dung + giọng nói → video người trong ảnh nói khớp môi | image_url + audio_url hoặc script | Mục bên dưới |
music_gen | Tạo bài nhạc (có lời hoặc hoà tấu) từ mô tả | prompt, lyrics, duration | Mục bên dưới |
music_cover | Phối lại / đổi giọng từ audio có sẵn | audio_url, mode | Mục bên dưới |
tts, stt | Chữ → giọng nói; giọng nói → chữ | văn bản (tts) / tệp âm thanh (stt) | API Docs |
try_on | Thử đồ ảo: mặc trang phục lên người trong ảnh | person_image_url, garment_image_url | Mục bên dưới |
remove_object | Xoá vật thể khỏi ảnh | image_url, prompt hoặc mask_urls[] | Mục bên dưới |
scan_objects | Phát hiện và gán nhãn các vật thể trong ảnh | image_url | Mục bên dưới |
remove_background | Tách nền ảnh tự động | image_url | Mục bên dưới |
nsfw_check | Kiểm duyệt nội dung ảnh | image_url, strict | Mục bên dưới |
tattoo | Ghép hình xăm lên đúng vùng da được chọn | image_url, tattoo_image_url, vùng chọn | API Docs |
ad_video | Video quảng cáo nhiều cảnh (2–10 cảnh) dựng tự động | kịch bản các cảnh | API Docs |
Ngoài job bất đồng bộ, API Docs còn mô tả các API đồng bộ: Chat LLM (mục 7) và Giọng nói (mục 8), cùng Decide API ở trên.
Faceswap & Upscale
faceswap
Đổi một khuôn mặt lên ảnh đích.
Bắt buộc: target_url, source_url
faceswap_multi
Đổi nhiều khuôn mặt trong một ảnh.
Bắt buộc: target_url, source_urls[]
faceswap_video
Đổi mặt trong video, giữ nguyên âm thanh. Video dài xử lý lâu hơn — nên dùng webhook.
Bắt buộc: target_url (video), source_url (ảnh mặt)
upscale
Nâng cấp, làm nét và khôi phục chi tiết ảnh bằng AI.
Bắt buộc: image_url
Tham số tuỳ chọn
| Tham số | Mặc định | Mô tả |
|---|---|---|
max_side | 1080 | Cạnh dài tối đa của ảnh kết quả (px). |
max_faces | 0 (tất cả) | Giới hạn số khuôn mặt được đổi. |
upscale | 1 | Bật nâng cấp độ phân giải (0/1). |
restore_face | 1 | Bật khôi phục chi tiết khuôn mặt (0/1). |
sharpen | 0.12 | Độ làm nét (0–1). |
Kiểm duyệt nội dung: nội dung đầu vào có thể được kiểm duyệt tự động. Vi phạm ⇒ status: "rejected" với mã NSFW_BLOCKED.
Tạo ảnh
ahv_image
Tạo ảnh từ mô tả (text-to-image) hoặc biến đổi ảnh có sẵn (image-to-image). Hệ thống tự chọn engine phù hợp.
gg_image
Tạo ảnh từ mô tả bằng engine bổ sung. Chi tiết trong API Docs.
cx_image
Tạo ảnh từ mô tả bằng engine bổ sung, hỗ trợ ảnh tham chiếu. Chi tiết trong API Docs.
Payload (ahv_image)
| Tham số | Bắt buộc | Mô tả |
|---|---|---|
prompt | Có | Mô tả ảnh mong muốn. |
image_url | Không | Ảnh nguồn cho image-to-image. |
width / height | Không | Kích thước ảnh kết quả. |
aspect_ratio | Không | 1:1, 16:9, 9:16. |
seed | Không | Số ngẫu nhiên cố định để tái tạo kết quả. |
Tham số nâng cao của từng engine: xem API Docs. Chỉ gửi các tham số có trong tài liệu.
Tạo video
ahv_video
Tạo video (có tiếng) từ mô tả, tuỳ chọn kèm ảnh nguồn (image-to-video).
Bắt buộc: prompt
Payload
| Tham số | Bắt buộc | Mô tả |
|---|---|---|
prompt | Có | Mô tả video. |
image_url | Không | Ảnh nguồn (image-to-video). |
duration | Không | Độ dài video, mặc định 6 giây. |
aspect_ratio | Không | 16:9, 9:16, 1:1. |
fps | Không | Số khung hình/giây. |
Việc tạo video mất nhiều thời gian hơn ảnh — hãy dùng webhook hoặc polling thưa (mỗi vài chục giây).
Talking video (lip sync)
Gửi một ảnh chân dung kèm nguồn giọng nói → nhận video người trong ảnh nói đúng lời, khớp môi. Dùng chung task: "talking_video"; ba luồng khác nhau ở nguồn giọng:
| Luồng | Payload | Mô tả |
|---|---|---|
| A | image_url + audio_url | Bạn đã có sẵn tệp âm thanh. |
| S | image_url + script (+ language) | Hệ thống đọc kịch bản bằng giọng máy (TTS). |
| SC | image_url + script + voice_ref_url (+ ref_text) | Hệ thống đọc kịch bản bằng giọng nhân bản từ một mẫu giọng. |
Tham số
| Tham số | Mô tả & giới hạn |
|---|---|
image_url | Bắt buộc. Ảnh người: JPG/PNG/WebP, ≤ 10 MB, cạnh ngắn ≥ 256 px, cạnh dài ≤ 4096 px, ≤ 16 megapixel. |
audio_url | Luồng A. mp3/wav/m4a/aac/ogg/flac/opus, ≤ 20 MB, dài 1–120 giây. |
script | Luồng S/SC. 1–800 ký tự; giọng đọc dài tối đa khoảng 60 giây (quá dài sẽ được rút ngắn). |
language | Tuỳ chọn, đi cùng script; mặc định vi. |
tts_instruct | Tuỳ chọn, ≤ 200 ký tự: mô tả phong cách giọng (giới tính, tuổi, cao độ…). Có thể viết tiếng Việt. Không nhận ra kiểu giọng nào ⇒ lỗi 400 TV_INSTRUCT_INVALID. |
voice_ref_url | Luồng SC. Giọng mẫu 5–30 giây, ≤ 10 MB, phải nghe rõ lời. |
ref_text | Tuỳ chọn, ≤ 500 ký tự: lời của giọng mẫu. Bỏ trống thì hệ thống tự xử lý. |
prompt | Tuỳ chọn, ≤ 300 ký tự: mô tả thêm dáng vẻ/cử chỉ khi nói. |
resolution | Tuỳ chọn; hiện chỉ nhận 480p (mặc định). |
seed | Tuỳ chọn, số nguyên 0–2147483647; nếu bỏ trống, hệ thống chọn ngẫu nhiên và trả lại trong meta.seed. |
Thời gian xử lý
Thời gian tỉ lệ thuận với độ dài video — từ vài phút đến vài chục phút. Hãy dùng webhook job.finished; nếu polling thì thưa (30–60 giây/lần). Video kết quả được đánh dấu là nội dung do AI tạo. Khi hệ thống đang bận có thể trả TV_BUSY; xem Mã lỗi. Chi tiết đầy đủ: API Docs, mục 9.
Nhạc: music_gen / music_cover
music_gen
Mô tả phong cách (+ lời, hoặc [auto:vi] để AI tự viết lời) → bài nhạc dài 30–240 giây. Có thể sáng tác từ ảnh (image_url) hoặc hoà tấu không lời.
Thường dùng: prompt, lyrics, duration, format
music_cover
Từ audio có sẵn + phong cách → phối lại hoặc đổi giọng. Bốn kịch bản theo mode (bảng dưới).
Luôn cần: audio_url
music_cover — bốn kịch bản
| Kịch bản | Payload | Làm gì |
|---|---|---|
| Phối lại + đổi giọng | mode: "remix" + prompt + voice_ref_url | Đổi giọng theo giọng mẫu, rồi phối lại nhạc theo prompt. |
| Phối lại · giữ giọng | mode: "remix" + prompt | Đổi phong cách nhạc, giữ nguyên lời. |
| Giữ nhạc · đổi giọng | mode: "voice" + voice_ref_url (không cần prompt) | Giữ nhạc gốc, đổi giọng hát theo giọng mẫu. |
| Tự hát → phối nhạc | mode: "vocal" + prompt | Bạn tự hát, hệ thống phối nhạc đệm. Không nhận voice_ref_url. |
- Sai tổ hợp tham số (ví dụ
mode: "voice"thiếuvoice_ref_url, hoặc thiếupromptởremix/vocal) ⇒ lỗi400ngay, không cần thử lại. - Đây là các task dài: dùng webhook hoặc polling thưa. Thời gian xử lý có thể dao động tuỳ độ dài và tình trạng hệ thống.
- Kết quả là liên kết HTTPS tới tệp âm thanh; liên kết chỉ tồn tại tạm thời — hãy tải về sớm.
Chi tiết payload: API Docs mục 5 (music_gen) và mục 6 (music_cover).
Virtual Try-On
try_on
Thử đồ ảo: mặc trang phục lên người trong ảnh.
Bắt buộc: person_image_url, garment_image_url
Payload
| Tham số | Bắt buộc | Mô tả |
|---|---|---|
person_image_url | Có | Ảnh người mặc. |
garment_image_url | Có | Ảnh trang phục. |
top_url | Không | Áo (khi thử riêng áo và quần). |
bottom_url | Không | Quần/váy (khi thử riêng áo và quần). |
prompt | Không | Hướng dẫn bổ sung. |
Lưu ý: ảnh cần có người rõ ràng, trang phục nhìn rõ; URL ảnh phải còn truy cập được cho tới khi job kết thúc. Hệ thống tự chọn cách xử lý phù hợp — phía khách không cần chọn. Chi tiết: API Docs.
Công cụ ảnh
remove_object
Xoá vật thể khỏi ảnh bằng mô tả hoặc bằng mask.
image_url + prompt hoặc mask_urls[]
scan_objects
Phát hiện và gán nhãn các vật thể trong ảnh.
image_url
remove_background
Tách nền ảnh tự động.
image_url
nsfw_check
Kiểm duyệt nội dung ảnh.
image_url, strict (low/medium/high)
Xoá nhiều vật thể trong một lượt
remove_object nhận mask_urls (tối đa 10 mask) để xoá nhiều vị trí một lần. Kết hợp với scan_objects (trả về nhãn, ảnh biểu tượng và mask của từng vật) để làm luồng “bấm chọn vật cần xoá”:
- Gọi
scan_objectsvới ảnh gốc → nhận danh sách vật thể kèmmask_url. - Người dùng chọn các vật muốn xoá.
- Gọi
remove_objectvớimask_urlslà các mask đã chọn.
Mask chỉ tồn tại tạm thời; hãy dùng ngay sau khi quét. Chi tiết: scan_objects, remove_object, remove_background.
Mã lỗi & cách xử lý
Khi gọi API (HTTP status)
| Mã | Ý nghĩa | Cách xử lý phía khách |
|---|---|---|
400 | Thiếu hoặc sai tham số, tổ hợp tham số không hợp lệ. | Sửa request. Không thử lại nguyên văn. |
401 | Thiếu hoặc sai khoá API. | Kiểm tra header X-API-Key. |
404 | job_id không tồn tại (hoặc đã bị xoá sau thời gian lưu). | Kiểm tra id; lưu kết quả sớm. |
422 | Dữ liệu đúng cấu trúc nhưng không xử lý được (ví dụ âm thanh không có lời). | Sửa dữ liệu đầu vào. |
429 | Gọi quá nhanh. | Chờ rồi gọi lại; giảm tần suất, dùng backoff. |
5xx | Lỗi hoặc quá tải tạm thời. | Thử lại với backoff (xem bên dưới). |
Khi job kết thúc không thành công
Job ở trạng thái failed hoặc rejected có đối tượng error dạng {"code": ..., "message": "..."}.
| Trường hợp | Ý nghĩa | Cách xử lý phía khách |
|---|---|---|
failed + code: 502 | Lỗi xử lý tạm thời hoặc quá thời gian (ví dụ quá thời gian xử lý). | Tạo job mới sau vài giây (tối đa vài lần). Nếu lặp lại, liên hệ AHV kèm job_id. |
rejected + NSFW_BLOCKED | Nội dung đầu vào vi phạm chính sách. | Không thử lại với cùng ảnh; báo người dùng chọn nội dung khác. |
failed + lỗi dữ liệu đầu vào | Ví dụ: URL không tải được, tệp ảnh không hợp lệ hoặc bị hỏng, không tìm thấy khuôn mặt/đối tượng, mask trống. | Kiểm tra lại URL và tệp; đây không phải lỗi hệ thống nên thử lại y nguyên sẽ không hết lỗi. |
Mã lỗi theo tính năng
| Mã | Task | Ý nghĩa | Xử lý |
|---|---|---|---|
TV_DISABLED | talking_video | Tính năng tạm thời không nhận job. | Thử lại sau. |
TV_DAILY_CAP | talking_video | Đã đạt hạn mức job trong ngày. | Chờ sang ngày mới hoặc liên hệ AHV. |
TV_BUSY | talking_video | Hệ thống đang bận. | Thử lại sau vài phút. |
TV_INSTRUCT_INVALID | talking_video | (400) tts_instruct không nhận ra kiểu giọng nào. | Sửa mô tả giọng; không thử lại nguyên văn. |
TTS_INSTRUCT_INVALID | tts | (400) instruct không nhận ra kiểu giọng nào. | Sửa mô tả giọng. |
400 | music_cover | Sai tổ hợp mode / prompt / voice_ref_url. | Sửa theo bảng kịch bản. |
Chiến lược thử lại
- Chỉ thử lại lỗi tạm thời:
429,5xx, và jobfailedvớicode: 502. - Không thử lại lỗi do dữ liệu (
400,422,NSFW_BLOCKED, lỗi tải ảnh) trước khi sửa dữ liệu. - Backoff luỹ thừa có jitter: chờ khoảng 2 → 4 → 8 → 16 giây (cộng ngẫu nhiên nhỏ), tối đa vài lần rồi dừng và báo lỗi cho người dùng.
- Khi tạo lại job sau lỗi, hãy dùng
job_idmới và ghi nhớjob_idcũ để đối soát.
Ví dụ: chờ kết quả bằng polling
import time
import requests
API = "https://ai.ahvchat.com"
HEADERS = {"X-API-Key": "YOUR_API_KEY"}
RETRY_HTTP = (429, 500, 502, 503, 504)
def wait_for_job(job_id, interval=3, timeout=3600):
# timeout: đặt theo loại task (video, nhạc, talking_video cần lâu hơn ảnh)
deadline = time.time() + timeout
while time.time() < deadline:
r = requests.get(f"{API}/v1/jobs/{job_id}", headers=HEADERS, timeout=15)
if r.status_code not in RETRY_HTTP:
r.raise_for_status()
job = r.json()
if job["status"] in ("succeeded", "failed", "rejected"):
return job
time.sleep(interval)
interval = min(interval * 1.5, 30) # thưa dần, tối đa 30 giây
raise TimeoutError(job_id)
Tránh tạo job trùng: nếu POST /v1/jobs bị timeout hoặc lỗi mạng, chưa chắc job đã được tạo. Hãy giới hạn số lần thử, và gắn mã đối soát của bạn (ví dụ mã đơn hàng) vào query của webhook_url để nhận diện và bỏ qua job trùng.
Giới hạn đầu vào
Các giới hạn dưới đây áp dụng cho từng tính năng; giới hạn chi tiết khác xem trong API Docs.
| Tính năng | Giới hạn |
|---|---|
| Mọi URL đầu vào (ảnh, video, âm thanh) | URL truy cập công khai (khuyến nghị HTTPS), tải trực tiếp được (không cần đăng nhập, không chặn hotlink) và phải còn tồn tại cho tới khi job kết thúc. Nguồn chặn tải trực tiếp: upload lên trước qua POST /upload. |
talking_video — ảnh | JPG/PNG/WebP, ≤ 10 MB, cạnh ngắn ≥ 256 px, cạnh dài ≤ 4096 px, ≤ 16 megapixel. |
talking_video — âm thanh | ≤ 20 MB, 1–120 giây (script: 1–800 ký tự, giọng đọc tối đa khoảng 60 giây). |
talking_video — giọng mẫu | 5–30 giây, ≤ 10 MB; tts_instruct ≤ 200 ký tự; ref_text ≤ 500; prompt ≤ 300. |
music_gen | Độ dài bài nhạc 30–240 giây. |
remove_object | mask_urls tối đa 10 mask mỗi lượt. |
faceswap / upscale | Cạnh dài kết quả mặc định tối đa 1080 px (max_side). |
| Decide API | 1–32 câu hỏi mỗi lần; state tối đa 2.048 token; choice có 2–255 nhãn; score có 2–10 mức. |
Âm thanh gửi để chuyển thành chữ (stt) | Tối đa 25 MB (webm, wav, mp3, m4a, ogg, opus, flac). |
Khuyến nghị tích hợp
- Ưu tiên webhook thay cho polling dày; nếu polling, bắt đầu sau vài giây và giãn dần (task nhanh: 2–3 giây/lần; video, nhạc, talking video: 30–60 giây/lần).
- Lưu
job_idngay khi tạo job; dùng nó để đối soát và khi cần hỗ trợ. - Xử lý webhook idempotent: cùng sự kiện có thể đến nhiều lần.
- Tải kết quả về và lưu riêng. Liên kết kết quả, mask và tệp upload chỉ tồn tại tạm thời; đừng dùng chúng làm kho lưu trữ lâu dài.
- Kiểm tra đầu vào trước khi gọi: URL còn sống và tải được, định dạng và kích thước hợp lệ, ảnh có nội dung phù hợp. Phần lớn lỗi job là do dữ liệu đầu vào.
- Phân loại lỗi: thử lại lỗi tạm thời có backoff; báo người dùng và sửa dữ liệu với lỗi 4xx /
rejected. - Hiển thị tiến độ cho người dùng bằng
progress,predict_timevàeta_utc. - Bảo vệ khoá API: chỉ gọi từ máy chủ của bạn, không đưa vào mã nguồn công khai hay ứng dụng phía người dùng.